package com.jqmobile.core.server.db;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import com.jqmobile.core.orm.IDBPool;
import com.jqmobile.core.server.Application;
import com.jqmobile.core.utils.plain.Log;
import com.jqmobile.core.utils.plain.StringUtils;
import com.jqmobile.core.utils.xml.IXMLNode;
/**
* 连接池
* @author modi
*
*/
public final class DBPool implements IDBPool{
private static DBPool pool;
public DataSource ds;
private boolean autoCommit;
static{
IXMLNode dbPropertiesXml = Application.getApplication().getDBProperties();
if(null == dbPropertiesXml){
pool = new DBPool();
}else{
pool = new DBPool(dbPropertiesXml);//new DBPool();
}
}
private DBPool(){
Properties p = getProperties();
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(p.getProperty("driver"));
ds.setUsername(p.getProperty("user"));
ds.setPassword(p.getProperty("password"));
ds.setUrl(p.getProperty("url")+"/"+p.getProperty("database")+"?useUnicode=true&characterEncoding="+p.getProperty("characterEncoding"));
// <param name="initialSize">3</param>
String initialSize = p.getProperty("initialSize");
if(StringUtils.isNotEmpty(initialSize, true)) ds.setInitialSize(Integer.parseInt(initialSize));
// <param name="maxActive">12</param>
String maxActive = p.getProperty("maxActive");
if(StringUtils.isNotEmpty(maxActive, true)) ds.setMaxActive(Integer.parseInt(maxActive));
// <param name="maxIdle">3</param>
String maxIdle = p.getProperty("maxIdle");
if(StringUtils.isNotEmpty(maxIdle, true)) ds.setMaxIdle(Integer.parseInt(maxIdle));
// <param name="minIdle">3</param>
String minIdle = p.getProperty("minIdle");
if(StringUtils.isNotEmpty(minIdle, true)) ds.setMinIdle(Integer.parseInt(minIdle));
// <param name="maxWait">3</param>
String maxWait = p.getProperty("maxWait");
if(StringUtils.isNotEmpty(maxWait, true)) ds.setMaxWait(Integer.parseInt(maxWait));
// <param name="validationQuery">SELECT 1 FROM SYSIBM.SYSDUMMY1</param>
String validationQuery = p.getProperty("validationQuery");
if(StringUtils.isNotEmpty(validationQuery, true)) ds.setValidationQuery(validationQuery);
//validationQueryTimeout
String validationQueryTimeout = p.getProperty("validationQueryTimeout");
if(StringUtils.isNotEmpty(validationQueryTimeout, true)) ds.setValidationQueryTimeout(Integer.parseInt(validationQueryTimeout));
// <param name="testOnBorrow">true</param>
String testOnBorrow = p.getProperty("testOnBorrow");
if(StringUtils.isNotEmpty(testOnBorrow, true)) ds.setTestOnBorrow(Boolean.parseBoolean(testOnBorrow));
// <param name="testOnReturn">true</param>
String testOnReturn = p.getProperty("testOnReturn");
if(StringUtils.isNotEmpty(testOnReturn, true)) ds.setTestOnReturn(Boolean.parseBoolean(testOnReturn));
// <param name="testWhileIdle">true</param>
String testWhileIdle = p.getProperty("testWhileIdle");
if(StringUtils.isNotEmpty(testWhileIdle, true)) ds.setTestWhileIdle(Boolean.parseBoolean(testWhileIdle));
//
String ac = p.getProperty("autoCommit");
if(StringUtils.isNotEmpty(ac, true)) autoCommit = Boolean.parseBoolean(ac);
//
ds.setValidationInterval(30000);
ds.setMaxAge(21600000);
ds.setValidationQuery("SELECT CURRENT_DATE");
this.ds = ds;
}
private IXMLNode node;
private DBPool(IXMLNode node){
this.node = node;
Log.getLog(getClass()).i("激活连接池"+node);
try {
Context initCtx = new InitialContext();
String name = node.getAttribute("name");
if(null != name && !name.isEmpty()){
ds = (DataSource)initCtx.lookup("java:comp/env/"+name);
}
} catch (Throwable e) {
// e.printStackTrace();
}
//从Context中lookup数据源。
if(null != ds){
try {
Connection conn = ds.getConnection();
conn.close();
return;
} catch (SQLException e) {
}
}
//
Log.getLog(getClass()).i("db datasource old");
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(getString("driver"));
ds.setUsername(getString("username"));
ds.setPassword(getString("password"));
ds.setUrl(getString("url")+"/"+getString("database")+"?useUnicode=true&characterEncoding="+getString("characterEncoding"));
// <param name="initialSize">3</param>
String initialSize = getString("initialSize");
if(StringUtils.isNotEmpty(initialSize, true)) ds.setInitialSize(Integer.parseInt(initialSize));
// <param name="maxActive">12</param>
String maxActive = getString("maxActive");
if(StringUtils.isNotEmpty(maxActive, true)) ds.setMaxActive(Integer.parseInt(maxActive));
// <param name="maxIdle">3</param>
String maxIdle = getString("maxIdle");
if(StringUtils.isNotEmpty(maxIdle, true)) ds.setMaxIdle(Integer.parseInt(maxIdle));
// <param name="minIdle">3</param>
String minIdle = getString("minIdle");
if(StringUtils.isNotEmpty(minIdle, true)) ds.setMinIdle(Integer.parseInt(minIdle));
// <param name="maxWait">3</param>
String maxWait = getString("maxWait");
if(StringUtils.isNotEmpty(maxWait, true)) ds.setMaxWait(Integer.parseInt(maxWait));
// <param name="validationQuery">SELECT 1 FROM SYSIBM.SYSDUMMY1</param>
String validationQuery = getString("validationQuery");
if(StringUtils.isNotEmpty(validationQuery, true)) ds.setValidationQuery(validationQuery);
//validationQueryTimeout
String validationQueryTimeout = getString("validationQueryTimeout");
if(StringUtils.isNotEmpty(validationQueryTimeout, true)) ds.setValidationQueryTimeout(Integer.parseInt(validationQueryTimeout));
// <param name="testOnBorrow">true</param>
String testOnBorrow = getString("testOnBorrow");
if(StringUtils.isNotEmpty(testOnBorrow, true)) ds.setTestOnBorrow(Boolean.parseBoolean(testOnBorrow));
// <param name="testOnReturn">true</param>
String testOnReturn = getString("testOnReturn");
if(StringUtils.isNotEmpty(testOnReturn, true)) ds.setTestOnReturn(Boolean.parseBoolean(testOnReturn));
// <param name="testWhileIdle">true</param>
String testWhileIdle = getString("testWhileIdle");
if(StringUtils.isNotEmpty(testWhileIdle, true)) ds.setTestWhileIdle(Boolean.parseBoolean(testWhileIdle));
//
String ac = getString("autoCommit");
if(StringUtils.isNotEmpty(ac, true)) autoCommit = Boolean.parseBoolean(ac);
//
ds.setMaxWait(10000);
ds.setRemoveAbandonedTimeout(60);
ds.setMinEvictableIdleTimeMillis(30000);
ds.setValidationInterval(1000);
ds.setMaxAge(21600000);
ds.setValidationQuery("SELECT CURRENT_DATE");
this.ds = ds;
}
private String getString(String string) {
if(null == node){
return null;
}
List<IXMLNode> nodes = node.getChilds(string);
if(1 == nodes.size()){
return nodes.get(0).getText();
}
return null;
}
// <?xml version="1.0" encoding="UTF-8"?>
// <!--
// the proxool configuration can be embedded within your own
// application's. Anything outside the "proxool" tag is ignored.
// -->
//<something-else-entirely>
// <proxool>
// <alias>dbname</alias> <!--数据源的别名-->
// <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:testdb</driver-url><!--url连接串-->
// <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!--驱动类-->
// <driver-properties>
// <property name="user" value="username" /> <!--用户名-->
// <property name="password" value="password" /><!--密码-->
// </driver-properties>
// <!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 -->
// <maximum-connection-count>100</maximum-connection-count>
// <!--最小连接数(默认2个)-->
// <minimum-connection-count>10</minimum-connection-count>
// <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒-->
// <house-keeping-sleep-time>90000</house-keeping-sleep-time>
// <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
// <maximum-new-connections>10</maximum-new-connections>
// <!--最少保持的空闲连接数(默认2个)-->
// <prototype-count>5</prototype-count>
// <!--在使用之前测试-->
// <test-before-use>true</test-before-use>
// <!--用于保持连接的测试语句 -->
// <house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql>
// </proxool>
//</something-else-entirely>
public static DBPool getInstance(){
return pool;
}
@Override
public synchronized Connection getConnection() throws SQLException {
// return DriverManager.getConnection("proxool.njt");
// Connection conn;
// try {
// conn = ((org.apache.tomcat.jdbc.pool.DataSource)ds).getConnectionAsync().get();
// } catch (Exception e) {
// throw new SQLException(e);
// }
Connection conn = ds.getConnection();
conn.setAutoCommit(autoCommit);
return conn;
}
private static Properties getProperties() {
Properties p = new Properties();
InputStream in = DBPool.class.getResourceAsStream("db.properties");
try {
p.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return p;
}
}