最简单的数据源,数据库连接池。
来源:互联网 发布:病毒 知乎 编辑:程序博客网 时间:2024/05/29 18:52
数据库连接池需要满足
- javax.sql.DataSource
- 对象池,对象池实际上是java.sql.Connection的缓存池。
实现
- maven依赖
我使用的是org.apache.commons>commons-pool2做的对象池。
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency>
- Java代码
package org.march.dbp.pool;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class ConnectionConfig extends GenericObjectPoolConfig { public ConnectionConfig() { }}package org.march.dbp.pool;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Connection;import java.sql.DriverManager;import org.apache.commons.pool2.BasePooledObjectFactory;import org.apache.commons.pool2.PooledObject;import org.apache.commons.pool2.impl.DefaultPooledObject;import org.march.dbp.conn.JdbcConfig;public class ConnectionFactory extends BasePooledObjectFactory<Connection> { private static final Class<?>[] IFACES = new Class<?>[] { Connection.class }; private JdbcConfig jdbcConfig; private ConnectionPool connectionPool; public ConnectionFactory(JdbcConfig jdbcConfig, ConnectionPool connectionPool) { this.jdbcConfig = jdbcConfig; this.connectionPool = connectionPool; } @Override public Connection create() throws Exception { Connection connection = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getPassword(), jdbcConfig.getPassword()); Connection con = (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(), IFACES, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("close")) { connectionPool.returnConn((Connection) proxy); return null; } else { return method.invoke(connection, args); } } }); return con; } @Override public PooledObject<Connection> wrap(Connection obj) { return new DefaultPooledObject<Connection>(obj); }}package org.march.dbp.pool;import java.sql.Connection;import org.apache.commons.pool2.impl.GenericObjectPool;import org.march.dbp.conn.JdbcConfig;public class ConnectionPool { private GenericObjectPool<Connection> pool = null; public static ConnectionPool build(JdbcConfig jdbcConfig) { return new ConnectionPool(jdbcConfig); } private ConnectionPool(JdbcConfig jdbcConfig) { ConnectionConfig myPoolConfig = new ConnectionConfig(); myPoolConfig.setMaxTotal(5); pool = new GenericObjectPool<>(new ConnectionFactory(jdbcConfig, this), myPoolConfig); } public Connection getConn() { try { Connection conn = pool.borrowObject(); return conn; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public void returnConn(Connection conn) { pool.returnObject(conn); }}package org.march.dbp.conn;public class JdbcConfig { private String url; private String username; private String password; public JdbcConfig(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } 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; } @Override public String toString() { return url + " " + username + " " + password; }}package org.march.dbp.ds;import java.io.PrintWriter;import java.sql.Connection;import java.sql.SQLException;import java.sql.SQLFeatureNotSupportedException;import java.util.logging.Logger;import javax.sql.DataSource;import org.march.dbp.conn.JdbcConfig;import org.march.dbp.pool.ConnectionPool;public class MarchDataSource implements DataSource { private PrintWriter out; private int loginTimeout; private ConnectionPool connectionPool; public MarchDataSource(String url, String username, String password) { connectionPool = ConnectionPool.build(new JdbcConfig(url, username, password)); } @Override public PrintWriter getLogWriter() throws SQLException { return out; } @Override public void setLogWriter(PrintWriter out) throws SQLException { this.out = out; } @Override public void setLoginTimeout(int seconds) throws SQLException { this.loginTimeout = seconds; } @Override public int getLoginTimeout() throws SQLException { return loginTimeout; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } @Override public Connection getConnection() throws SQLException { return connectionPool.getConn(); } @Override public Connection getConnection(String username, String password) throws SQLException { return null; }}
- 测试
public class MarchDataSourceTest extends TestCase { public MarchDataSourceTest(String testName) { super(testName); } public void testApp() throws SQLException { MarchDataSource m = new MarchDataSource("jdbc:mysql://127.0.0.1:3306/wang", "root", "root"); Connection con = m.getConnection(); System.out.println(con); con.close(); }}
代码在 https://github.com/faicm/march/tree/master/march-dbp。我还会持续修改。
0 0
- 最简单的数据源,数据库连接池。
- 最简单的数据库连接池(SQLlite)
- 最简单的数据库连接实例
- 数据源(数据库连接池的简易实现)
- 数据源,连接池,数据库连接之间的关系
- 数据源 与数据库连接池的 关系
- 数据源,连接池,数据库连接之间的关系
- DBCP:常见的数据库连接池(数据源)
- java&jsp最简单的注册数据库连接
- 数据库连接池(数据源)1
- 数据源(数据库连接池)
- 数据库连接池+C3P0数据源
- 数据源 和数据库连接池
- Java程序数据库连接,数据源配置,数据库连接池
- Java程序数据库连接,数据源配置,数据库连接池
- 数据库连接池,数据源,数据库连接,JNDI,JAVA
- 数据库连接池,数据源,数据库连接,JNDI,JAVA
- 数据库连接池,数据源,数据库连接,JNDI,JAVA
- Oracle 使用标量变量接收游标数据
- STL
- BZOJ 2081 [Poi2010]Beads 哈希
- 获取用户基本信息subscribe_time单位问题
- c++中cin与cout处理不同进制
- 最简单的数据源,数据库连接池。
- 日期格式化和SimpleDateFormat问题
- Trie树
- Java transient关键字使用小记
- springmvc注解视频
- Codeforces 355C Vasya and Robot 暴力枚举
- 通过jsonp实现跨域
- w3school链接
- HTTP(GET和POST访问URL) -- wininet