- 论坛徽章:
- 1
|
[代码][Java]代码- package com.jxva.dao;
-
- import java.io.PrintWriter;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.sql.SQLFeatureNotSupportedException;
- import java.util.Date;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.concurrent.ConcurrentMap;
- import java.util.concurrent.Semaphore;
-
- import javax.sql.DataSource;
-
- import com.jxva.log.Logger;
- import com.jxva.util.RandomUtil;
-
- public class SimpleDataSource implements DataSource{
-
- private String driverClass;
- private String url;
- private String username;
- private String password;
- private int minSize;
- private int maxSize;
-
- private static final Logger log = Logger.getLogger(SimpleDataSource.class);
- private static final ConcurrentMap<Connection, Date> pool = new ConcurrentHashMap<Connection, Date>();
- private Semaphore semaphore;
-
- public SimpleDataSource() {
- minSize = 1;
- maxSize = 5;
- log.debug("Database Connection Pool initializing...");
- }
-
-
- public void close(Connection conn) throws SQLException {
- try{
- synchronized (pool) {
- if (pool.size() < maxSize) {
- pool.put(conn,new Date());
- return;
- }
- }
- conn.close();
- }finally{
- semaphore.release();
- }
- }
-
- public void destroy() throws SQLException {
- for (Connection conn : pool.keySet()) {
- conn.close();
- }
- pool.clear();
- }
-
- @Override
- public Connection getConnection() throws SQLException {
- try {
- semaphore.acquire();
- } catch (InterruptedException e1) {
- //ignore
- }
- synchronized (pool) {
- if (!pool.isEmpty()) {
- //Connection conn = pool.keySet().iterator().next();// fetch last connection for ever
- Connection conn=(Connection)pool.keySet().toArray()[RandomUtil.getRandomNum(pool.size())]; //random fetch one connection
- pool.remove(conn);
- try {
- conn.setAutoCommit(true);
- } catch (SQLException e) {
- pool.clear();
- conn = getConnection();
- }
- return getProxyConnection(conn);
- }
- }
- //System.out.println(url);
- //System.out.println(username+":"+password);
- //return DriverManager.getConnection("jdbc:mysql://10.204.79.234:3306/library?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8",username,password);
-
- //url = "jdbc:mysql://10.204.79.234:3306/library?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8";
- return getProxyConnection(DriverManager.getConnection(url,username,password));
- }
-
- private Connection getProxyConnection(Connection connection) {
- final Connection conn = connection;
- InvocationHandler handler = new InvocationHandler() {
- public Object invoke(Object proxy, Method method, Object[] params) throws Exception {
- Object ret = null;
- if ("close".equals(method.getName())) {
- close(conn);
- } else {
- ret = method.invoke(conn, params);
- }
- return ret;
- }
- };
- return (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(), new Class[] { Connection.class }, handler);
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public int getMinSize() {
- return minSize;
- }
-
- public void setMinSize(int minSize) {
- this.minSize = minSize;
- }
-
- public int getMaxSize() {
- return maxSize;
- }
-
- public void setMaxSize(int maxSize) {
- semaphore=new Semaphore(maxSize,false);
- this.maxSize = maxSize;
- }
-
- public String getDriverClass() {
- return driverClass;
- }
-
- public void setDriverClass(String driverClass) {
- try {
- Class.forName(driverClass);
- } catch (ClassNotFoundException e) {
- log.error(driverClass+" not exists.");
- throw new DataSourceException(driverClass+" not exists.",e);
- }
- this.driverClass = driverClass;
- }
-
- @Override
- public PrintWriter getLogWriter() throws SQLException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getLoginTimeout() throws SQLException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public java.util.logging.Logger getParentLogger()
- throws SQLFeatureNotSupportedException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void setLogWriter(PrintWriter arg0) throws SQLException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setLoginTimeout(int arg0) throws SQLException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean isWrapperFor(Class<?> arg0) throws SQLException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public <T> T unwrap(Class<T> arg0) throws SQLException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Connection getConnection(String arg0, String arg1)
- throws SQLException {
- // TODO Auto-generated method stub
- return null;
- }
- }
复制代码 |
|