Druid数据源的独立运行代码&Spring整合

版权声明:本文为博主原创文章,未经博主允许不得转载。 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()来获得数据库连接. 

猜你喜欢

转载自blog.csdn.net/rocklee/article/details/89281660