版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rocklee/article/details/89281660
由于独立Test或其他原生的SQL需要用到Connection,所以就写了一个ConnectionProvider类用于加载Druid配置文件并提供datasource和Connection, 但由于webapp就是基于SSM的, 所以在spring容器里也想加载druid datasource. 但大多数的spring配置druid都会以新建一个datasource的方式实现(用下面类似xml指定参数的方式).
既然druid的配置文件已经有了, 就没必要再在spring容器配置里面又打一遍, 利用起来就好了. 另外需要解决的是, datasource只是ConnectionProvider的一个输出函数, 怎么用其注册到spring容器里?? 一时间找不到资料.
既然用spring配置文件实现不了, 就改为用注解吧, 将ConnectionProvider加上注解, 让spring容器运行时动态加载,并将getDataSource注解为"dataSource"即可 .
package com.freestyle.common.db;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
@Service
public class ConnectionProvider {
private final static Object _lockObj="ConnectionProvider";
private static DruidDataSource druidDataSource=null;
public static Connection getConnection() throws SQLException {
synchronized(_lockObj) {
if (druidDataSource==null) {
initWithConfig("db.druid.properties");
}
}
return druidDataSource.getConnection();
}
public ConnectionProvider() {
getDataSource();
}
private static Properties loadPropertiesFile(String fullFile) {
String webRootPath = null;
if (null == fullFile || fullFile.equals("")) {
throw new IllegalArgumentException("Properties file path can not be null" + fullFile);
}
webRootPath = ConnectionProvider.class.getClassLoader().getResource("").getPath();
//webRootPath = new File(webRootPath).getParent();
InputStream inputStream = null;
Properties p = null;
try {
inputStream = new FileInputStream(new File(webRootPath + File.separator + fullFile));
p = new Properties();
p.load(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return p;
}
@Bean(name="dataSource")
public DataSource getDataSource() {
synchronized(_lockObj) {
if (druidDataSource==null) {
initWithConfig("db.druid.properties");
}
}
return druidDataSource;
}
public static boolean initWithConfig(String pvConfigFile) {
Properties properties = loadPropertiesFile("/db.druid.properties");
try {
druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); // DruidDataSrouce工厂模式
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
//log.error("获取配置失败");
}
}
}
然后在application.xml加载spring-db前先扫描加载ConnectionProvider所在的package .
最后贴出db.druid.properties的配置文件:
driverClassName=org.postgresql.Driver
url=jdbc:postgresql://127.0.0.1:5432/yourdb
username=postgres
password=123456789
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
经过以上配置, spring亦能拿得到dataSource, 也可以通过ConnectionProvider.getConnection()来获得数据库连接.