java 连接池 单例_java-单例不利于获得JDBC连接吗?连接池有什么好的实现吗?

我使用单例模式为独立应用程序获取jdbc连接.代码如下.

public static synchronized MysqlConnect getDbCon() {

if ( db == null ) {

db = new MysqlConnect();

}

return db;

}

但是我在很多讨论中都发现单身人士不利于建立联系.是真的吗

并建议使用连接池.谁能给我一个好的使用连接池的实现,而不是上面的代码?

解决方法:

这是一个简单的基于单例的连接池实现.该连接池支持使用DriverManager界面或通过数据源(JNDI)获得连接.

我将这个连接池用于我的某些项目(尽管实际实现稍微复杂一些)

public class ConnectionPool{

private String jdbcDriver;

private String jdbcURL;

private String user;

private String password;

private int connectionCount=10;

private List connections;

private static boolean loadFromDataSource;

private static DataSource dataSource;

private static ConnectionPool connPool;

private ConnectionPool() throws EasyORMException{}

private void setConnection(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{

this.jdbcDriver = jdbcDriver;

this.jdbcURL=jdbcURL;

this.user=user;

this.password=password;

connections= new ArrayList();

connections.add((ConnectionPool.loadFromDataSource) ? getConnectionFromDataSource() : getConnection());

}

static ConnectionPool getInstance(){

return connPool;

}

private static ConnectionPool getInstanceFromJndi(String propertyFile,boolean loadFromJndi) throws EasyORMException{

ConnectionProp cp=readPropFromFile(propertyFile);

if(loadFromJndi){

dataSource=createDatasource(cp.getDataSource());

loadFromDataSource=true;

}

return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource())

}

public static ConnectionPool getInstance(String propertyFile,boolean loadFromJndi) throws EasyORMException{

return ConnectionPool.getInstanceFromJndi(propertyFile, loadFromJndi, false);

}

public static ConnectionPool getInstance(ConnectionProp cp) throws EasyORMException{

return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource());

}

public static ConnectionPool getInstance(String jndiName) throws EasyORMException{

dataSource=createDatasource(jndiName);

loadFromDataSource=true;

return ConnectionPool.createConnectionPool(null,null, null, null,jndiName);

}

public static ConnectionPool getInstance(String jdbcDriver, String jdbcURL, String user, String password) throws EasyORMException{

return ConnectionPool.createConnectionPool(jdbcDriver,jdbcURL, user, password,null);

}

private static ConnectionPool createConnectionPool(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{

if(connPool==null) {

connPool = new ConnectionPool();

connPool.setConnection(jdbcDriver, jdbcURL, user, password, dbDataSource);

}

return connPool;

}

synchronized Connection getAvailableConnection() throws EasyORMException {

Connection conn=null;

int connSize = connections.size();

if(connSize>0){

conn=connections.remove(connSize-1);

}else{

if(connSize

for(int i=0;i

conn=(ConnectionPool.loadFromDataSource)?getConnectionFromDataSource() :getConnection();

}else{

throw new EasyORMException(EasyORMException.CONNECTION_NUM_EXCEEDED);

}

}

return conn;

}

synchronized void returnConnection(Connection conn){

connections.add(conn);

}

private Connection getConnection() throws EasyORMException {

Connection conn=null;

try {

Class.forName(jdbcDriver);

conn = DriverManager.getConnection(jdbcURL, user, password);

} catch (ClassNotFoundException e) {

throw new EasyORMException(e);

} catch (SQLException e) {

throw new EasyORMException(e);

}

return conn;

}

private Connection getConnectionFromDataSource() throws EasyORMException {

try{

return dataSource.getConnection();

}catch(SQLException e){

throw new EasyORMException(e);

}

}

public void setNumberOfConnections(int count){

this.connectionCount=count;

}

public int getNumberOfConnections(){

return connectionCount;

}

private static DataSource createDatasource(String jndiDb)throws EasyORMException{

InitialContext initCtx=null;

try {

initCtx = new InitialContext();

return (DataSource)initCtx.lookup("java:comp/env/"+jndiDb);

} catch (NamingException e) {

throw new EasyORMException(e);

}finally{

if(initCtx!=null){

try {

initCtx.close();

} catch (NamingException e) {

throw new EasyORMException(e);

}

}

}

}

}

某些方法没有公共访问权限(因为它们是作为库的一部分编写的),但是您可以根据需要将其更改为公共方法.

标签:java,jdbc,singleton,connection-pooling

来源: https://codeday.me/bug/20191010/1886108.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值