Spring配置数据源
转载:https://www.cnblogs.com/yangchongxing/p/10027495.html
1、使用JNDI数据源
Spring应用程序经常部署在Java EE应用服务器中,如WebSphere、JBoss或甚至像Tomcat这样的Web容器中。这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。
参考文档:The Tomcat JDBC Connection Pool https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html
在服务器的server.xml的Context元素下配置Resource
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" testWhileIdle="true" testOnBorrow="true" testOnReturn="false" validationQuery="SELECT 1" validationInterval="30000" timeBetweenEvictionRunsMillis="30000" maxActive="100" minIdle="10" maxWait="10000" initialSize="10" removeAbandonedTimeout="60" removeAbandoned="true" logAbandoned="true" minEvictableIdleTimeMillis="30000" jmxEnabled="true" jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" username="root" password="123456" driverClassName ="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ycxfw" />
Java配置查找数据源
package cn.ycx.config; import javax.naming.NamingException; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.jndi.JndiObjectFactoryBean; @Profile("PROD") @Configuration public class JndiDataSourceConfig { @Bean public DataSource dataSource() throws IllegalArgumentException, NamingException { System.out.println("JndiDataSourceConfig..."); JndiObjectFactoryBean jndi = new JndiObjectFactoryBean(); jndi.setJndiName("jdbc/mysql"); jndi.setResourceRef(true);//自动添加 java:comp/env/ 前缀 jndi.setProxyInterface(javax.sql.DataSource.class); jndi.afterPropertiesSet(); return (DataSource) jndi.getObject(); } }
若想在xml文件中配置则使用注解@ImportResource(value="classpath:context.xml")
@Profile("PROD")
@Configuration
@ImportResource(value="classpath:context.xml")
public class JndiDataSourceConfig
Java业务代码
package cn.ycx.service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class IndexServiceImpl implements IndexService { @Autowired private DataSource dataSource; @Override public List<Map<String, String>> get() { try { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); Map<String, String> item = null; Connection con = dataSource.getConnection(); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery("select id,username from user"); while(rs.next()) { item = new HashMap<String, String>(); item.put("id", rs.getString("id")); item.put("username", rs.getString("username")); list.add(item); } rs.close(); stm.close(); con.close(); return list; } catch (Exception e) { e.printStackTrace(); } return null; } public Map<String, String> add() { try { Random r = new Random(); LocalDateTime dt = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Connection con = dataSource.getConnection(); PreparedStatement pstm = con.prepareStatement("insert into user(id,username)values(?,?)"); pstm.setString(1, dt.format(formatter)); pstm.setString(2, String.valueOf(r.nextInt())); int count = pstm.executeUpdate(); pstm.close(); con.close(); Map<String, String> data = new HashMap<String, String>(); data.put("status", String.valueOf(count)); return data; } catch (Exception e) { } return null; } }
注入数据源
@Autowired
private DataSource dataSource;
使用Connection con = dataSource.getConnection();取得链接