- JDBC driver
- 設定 server.xml
在 eclipse 中加入 Server 後,可以選擇要將那些專案加入 server 中,這裡選擇一個命名為 Party 的專案,按【Finish】後,在 server.xml 中就會產生如下內容:
<Context docBase="Party" path="/Party" reloadable="true" source="org.eclipse.jst.jee.server:Party" />
<Context docBase="Party" path="/Party" reloadable="true" source="org.eclipse.jst.jee.server:Party"> <Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" maxIdle="10" maxTotal="20" maxWaitMillis="-1" name="jdbc/DemoDB" password="passw0rd" type="javax.sql.DataSource" url="jdbc:oracle:thin:@192.168.0.102:1521:DemoDB" username="steven"/> </Context>
- web.xml
<resource-ref> <description>oracleDB</description> <res-ref-name>jdbc/DemoDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
- WebInitializer
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { MvcConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
- 在啟始類別中建立資料庫連線
1 @Configuration 2 @ComponentScan( 3 basePackages = {"idv.steven.invitation"}, 4 includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Configuration.class), 5 excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) 6 ) 7 @Log4j 8 public class RootConfig { 9 10 @Bean 11 @Profile("PROD") 12 public JndiObjectFactoryBean jndiObjectFactoryBean() { 13 JndiObjectFactoryBean jndiObjectFB = new JndiObjectFactoryBean(); 14 jndiObjectFB.setJndiName("jdbc/DemoDB"); 15 jndiObjectFB.setResourceRef(true); 16 jndiObjectFB.setProxyInterface(javax.sql.DataSource.class); 17 18 return jndiObjectFB; 19 } 20 21 @Bean 22 @Profile("TEST") 23 public DataSource dataSource() { 24 BasicDataSource ds = new BasicDataSource(); 25 ds.setDriverClassName("oracle.jdbc.OracleDriver"); 26 ds.setUrl("jdbc:oracle:thin:@192.168.0.102:1521:DemoDB"); 27 ds.setUsername("steven"); 28 ds.setPassword("passw0rd"); 29 ds.setInitialSize(5); 30 31 return ds; 32 } 33 }
- 如文章一開頭說的,在正式營運環境和開發環境有可能使用不同的資料庫連線方式,這裡就是這樣,建立了兩個不同的連線方式,一個是使用 JndiObjectFactoryBean,另一個使用 DataSource。
- 第 14 行設定要使用那個 JNDI 資源,當第 15 行的 setResourceRef 設定為 true 時,就寫成如上面的方式,如果設定為 false,就得寫成 java:comp/env/jdbc/DemoDB。
- 第 11、22行指出這兩個 bean 會在什麼環境裡啟動,至於在什麼環境要怎麼判斷? 這是在 web.xml 中設定的,如下,裡面設定了 spring.profiles.active 的值為 PROD,這表示程式啟動時,只有 JndiObjectFactoryBean 會被建立,DataSource 不會被建立,反之亦然。
<context-param> <param-name>spring.profiles.active</param-name> <param-value>PROD</param-value> </context-param>
- JPA config
1 @Configuration 2 @EnableTransactionManagement 3 @EnableJpaRepositories ( 4 basePackages = { "idv.steven.invitation.database.dao" }, 5 entityManagerFactoryRef = "entityManagerFactory", 6 transactionManagerRef = "jpaTransactionManager" 7 ) 8 public class JpaConfig { 9 @Autowired(required=false) 10 private DataSource dataSource; 11 12 @Autowired(required=false) 13 private JndiObjectFactoryBean jndiObjectFB; 14 15 @Bean 16 public JpaVendorAdapter jpaVendorAdapter() { 17 HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 18 19 adapter.setDatabase(Database.ORACLE); 20 adapter.setShowSql(true); 21 adapter.setGenerateDdl(false); 22 adapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect"); 23 24 return adapter; 25 } 26 27 @Bean 28 public PlatformTransactionManager jpaTransactionManager() { 29 JpaTransactionManager tm = new JpaTransactionManager(); 30 tm.setEntityManagerFactory(this.entityManagerFactory().getObject()); 31 32 return tm; 33 } 34 35 @Bean 36 public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 37 LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); 38 if (dataSource == null) 39 emf.setDataSource((DataSource) jndiObjectFB.getObject()); 40 else 41 emf.setDataSource(dataSource); 42 emf.setPackagesToScan(new String[] { "idv.steven.invitation.database.entity" }); 43 emf.setJpaVendorAdapter(this.jpaVendorAdapter()); 44 45 return emf; 46 } 47 }
【Forza Gesù -- 一個小女孩成長的故事】
讚!
回覆刪除