定义了一个数据库连接池

2020再出发 2020-07-22 12:08:16

定义了一个数据库连接池,经测试,可以使用。但现在面临的问题是。有2个类都要使用这个连接池,其他类中应该怎么引用这个类?麻烦您了

连接池是这样定义的

mport Mode.Link;
import Tools.LinkType;
import javax.swing.*;
import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

/**
* @类名称: ZjcPool
* @功能: 中间层连接池
* @返回:
* @理解:
*/
public class ZjcPool {

private static ZjcPool zjcPool;

private Link link=new Link();
private LinkedList<Connection> Zjc_Source = new LinkedList<>();
private int MaxCnt=0;//定义初始链接数量
private Connection retCon;//定义返回连接
private String dbDriver = "oracle.jdbc.driver.OracleDriver";
private String dbURL = "jdbc:oracle:thin:@192.168.2:orcl";
private String dbUser = "PHIP";
private String dbPwd = "PHIP";

//构造函数
private ZjcPool(Link link,int cnt){
this.link=link;
this.MaxCnt=cnt;
Init();
}


//单例模式实现方法
public synchronized static ZjcPool getInstance(Link link,int cnt){
if(zjcPool==null){
zjcPool=new ZjcPool(link,cnt);
return zjcPool;
}
System.out.println("重复");
return null;
}



// 执行初始化
public synchronized void Init(){
LinkType type = this.link.getType();
try{
switch(type) { //根据type字段获取连接数据库类型,并组合链接驱动
case ORACLE:
this.dbDriver = "oracle.jdbc.driver.OracleDriver";
this.dbURL = "jdbc:oracle:thin:@" + this.link.getIP() + ":" + this.link.getPort() + ":" + this.link.getDataBaseName();
break;
case MSSQL:
this.dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
this.dbURL = "jdbc:sqlserver://" + this.link.getIP() + ":" + this.link.getPort() + ";databaseName=" + this.link.getDataBaseName() + ";";
}
this.dbUser = this.link.getUser();
this.dbPwd = this.link.getPassword();
Class.forName(this.dbDriver); //获取dbDriver的Class对象
for(int a=0;a<MaxCnt;a++) {
this.retCon = DriverManager.getConnection(this.dbURL, this.dbUser, this.dbPwd);
Zjc_Source.add(retCon);
}
}catch (Exception var6) {
var6.printStackTrace();
JOptionPane.showMessageDialog((Component)null, var6.getLocalizedMessage(), "提示", 0);
}
}


//返回一个链接对象
public synchronized Connection getZjc_Con() {
if(Zjc_Source.isEmpty()){
return null;
}
return this.retCon= Zjc_Source.pollFirst(); //删除第一个链接对象并返回第一个链接对象
}

//对返回来的链接对象添加到缓冲池中
public synchronized void releaseConnection(Connection conn) {
Zjc_Source.add(conn);
}

//关闭所有链接
public synchronized void CloseALLConn(){
Connection con;
for(int i=0;i<Zjc_Source.size();i++){
con=Zjc_Source.get(i);
try{
con.close();
}catch (SQLException E){
E.printStackTrace();
}
}
}




}
...全文
641 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
2020再出发 2020-07-22
  • 打赏
  • 举报
回复
谢谢您老师 !
qybao 2020-07-22
  • 打赏
  • 举报
回复
引用 6 楼 2020再出发 的回复:
这样对吗? 老师

你既然用了静态的zjcPool,为何A还要用非静态方法init来初始化zjcPool?要么都统一静态,要么都统一成员
比如
A类
public static ZjcPool zjcPool = ZjcPool.getInstance(XMLOperation.getLinkWithLinkID("1"), 10);

B类
A.zjcPool.getcon
2020再出发 2020-07-22
  • 打赏
  • 举报
回复
这样对吗? 老师
2020再出发 2020-07-22
  • 打赏
  • 举报
回复
谢谢您老师,我用代码试过可以,我是这样做的,比如在a类中进行如下的定义 public static ServerPool server_pool; public static ZjcPool zjcPool; //连接池初始化 private void init(){ Link link_zjc = XMLOperation.getLinkWithLinkID("1"); //获取中间层的链接配置 zjcPool=ZjcPool.getInstance(link_zjc,10);//获取中间层连接池实例 然后在B类中直接用下面的方法引用 A.zjcPool.getcon
2020再出发 2020-07-22
  • 打赏
  • 举报
回复
我试下 老师
qybao 2020-07-22
  • 打赏
  • 举报
回复
引用 2 楼 2020再出发 的回复:
我知道你的意思,一个类我知道怎么使用,不知道2个类怎么使用,因为这个类需要用单例模式,比如a类中做了static ZjcPool pool = ZjcPool. getInstance();的声明 b类如果再做这样的声明就会出错

我的意思你没明白?
为什么b类需要再声明?b类直接用a类的pool不就好了?如果不想b类直接访问a类的静态成员,就在a类提供一个接口返回pool
如果a和b两个类本身互不可见,那设计上本身就有问题,ZjcPool 的 getInstance 最后不应该返回 null,而是返回 zjcPool,因为 zjcPool 本身就是单实例
2020再出发 2020-07-22
  • 打赏
  • 举报
回复
我知道你的意思,一个类我知道怎么使用,不知道2个类怎么使用,因为这个类需要用单例模式,比如a类中做了static ZjcPool pool = ZjcPool. getInstance();的声明 b类如果再做这样的声明就会出错
qybao 2020-07-22
  • 打赏
  • 举报
回复
都能写连接池了,还不知道怎么共享对象?
最简单就是可以定一个static ZjcPool pool = ZjcPool. getInstance();
其它类都使用这个pool

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧