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; } }