单例不适合获取 JDBC 连接吗?连接池有什么好的实现吗?

2024-02-19

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

public static synchronized MysqlConnect getDbCon() {
    if ( db == null ) {
        db = new MysqlConnect();
    }
    return db;
}

但我在许多讨论中看到单例不利于获得连接。这是真的吗? 并建议使用连接池。谁能给我一个好的连接池实现来代替上面的代码?


这是一个简单的、基于单例的连接池实现。此连接池支持使用 DriverManager 接口或通过 DataSource (JNDI) 获取连接。

我在我的一些项目中使用这个连接池(尽管实际实现稍微复杂一些)

public class ConnectionPool{
private String jdbcDriver;
private String jdbcURL;
private String user;
private String password;
private int connectionCount=10;
private  List<Connection> 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<Connection>();   
    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<connectionCount){ 
            for(int i=0;i<initialConnCount;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);
            }
        }
    }
}
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单例不适合获取 JDBC 连接吗?连接池有什么好的实现吗? 的相关文章

  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • Kotlin Room 数据库单例模式

    我正在尝试创建单人房间数据库 我找到了两种解决方案 但我不知道它们之间有什么区别 根据这个文件 companion object Volatile private var INSTANCE AppDatabase null fun getI
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav
  • Libgdx 和 Google 应用内购买结果

    我遵循了这些指示 https github com libgdx libgdx wiki Interfacing with platform specific code使用 ActionResolver 接口集成 Libgdx 和原生 An

随机推荐

  • 如何在 IE8 中模拟最小宽度

    IE8 文档说它支持 min width 但它似乎对我不起作用 我想要的最小宽度的 html 位于表格单元格中 我在这里看到另一个问题 建议向每个单元格添加一个 1 像素高度的 div 并设置宽度 但这不起作用 出于某种原因 IE 将其渲染
  • UIView 带有圆角和阴影?

    我已经在一个应用程序上工作了几年 并收到了一个简单的设计请求 圆化 UIView 的角并添加阴影 按照下面给出的操作 我想要定制UIView 我只是想要一个带有圆角和浅色阴影的空白白色视图 没有照明效果 我可以一一做 但通常的clipToB
  • pandas 多索引数据帧,缺失值的 ND 插值

    pandas 是否可以在多索引数据帧中插入缺失值 下面的示例没有按预期工作 arr1 np array np arange 1 10 1 arr2 np array np arange 2 20 2 df1 pd DataFrame zip
  • 如何使用 PayPal 以编程方式退款?

    正在开发我的贝宝集成并且进展顺利 我想知道在需要退款的情况下是否有办法以编程方式进行退款 根据我的理解 您应该使用 Refund API
  • 将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是什么

    我不确定我一直在使用的方法是否sympy转换一个MutableDenseMatrix to a numpy array or numpy matrix目前是一个很好的做法 我有一个符号矩阵 例如 g sympy Matrix x 2 x 3
  • SendGrid API 密钥不起作用。 “所提供的授权无效、已过期或已撤销”

    SendGrid 似乎阻止我的 Node js 服务器发送电子邮件 我在发送电子邮件的响应中收到此错误消息 提供的授权无效 已过期或已撤销 我也有一个 API 密钥设置并遵循了文档 Answer recommended by Twilio
  • 去掉cpp生成的注释

    I use include frontend tokens mll in lexer mll 进而cpp C P frontend lexer mll o frontend lexer new mll生成lexer new mll 这一直有
  • 如何查看我的机器上安装的 gem 的源代码?

    我在 Rails 应用程序中安装了 Devise 我想通读源代码并了解它的工作原理 我查看了 Rails 应用程序的整个文件夹结构 但找不到任何代码 方法调用除外 我知道我可以从 Github 存储库中看到源代码 但我希望在我的编辑器和本地
  • 使用框架时在 PHP 中注释代码

    我正在使用以下命令创建一个简单的应用程序Kohana https en wikipedia org wiki Kohana framework PHP 框架 仅供参考 这是我第一次使用该框架 在开发类或函数时 我使用 DocBlock 注释
  • 将三星 S7 连接到 Android Studio

    我喜欢使用 Android Studio 直接在 Samsung S7 上启动我的应用程序 我已经通过在内部版本号上点击 7 次来在开发人员选项中启用调试模式 但在启动应用程序并获取 选择部署目标 对话框时我仍然看不到设备 我还需要做什么
  • Xdebug:[单步调试] 连接调试客户端超时,等待:200 毫秒。尝试过:本地主机:9003

    我的 php ini 配置 XDebug zend extension C xampp php ext php xdebug dll xdebug mode debug xdebug remote autostart on xdebug p
  • 无论我如何尝试都无法加载资源

    我正在尝试加载已添加到项目中的资源 它告诉我 路径中存在非法字符 现在 资源的名称是 ShortcutList txt 我不认为这有任何违法之处 我使用的代码是 public void InitShortcuts try string s
  • PowerShell get-acl 列出文件夹内容与 ReadAndExecute

    这是一个简单的问题 但我在谷歌或这里还找不到答案 通过使用 PowerShell 或 cmd 无第三方工具 如何以允许我区分 列出文件夹内容 和 ReadAndExecute 的方式检索文件夹权限 现在 当我在文件夹上执行 Get Acl
  • 如何在样式中引用主题属性?

    我有以下问题 我想自定义列表中行的外观 但在膨胀过程中抛出异常 style xml 中的一段代码 属性 xml
  • Mercurial 合并存储库作为分支

    我有两个 Mercurial 存储库 用于同一项目的不同主要修订 后一个版本是massive更改了项目的功能 尤其是 UI 但它仍然具有许多与早期版本相同的代码 为了方便起见 我将这些版本称为4 6 and 5 0和存储库项目 4 x an
  • 在 C++ 中使用什么来表示定点? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找用于财务数据的定点标准 您知道有哪些值得尝试吗 您对手工制作的定点类的性能有什么经验吗 Dr
  • 有没有比 PathGeometry.FillContainsWithDetail() 更有效的方法来检测多边形重叠/相交?

    我有一个方法占用了 25 的 cpu 时间 我每秒调用此方法约 27 000 次 是的 有很多电话 因为它经常更新 我想知道是否有人知道一种更快的方法来检测两个多边形是否重叠 基本上 我必须检查屏幕上的移动对象与屏幕上的静止对象 我正在使用
  • Angular 5 中从本地文件到 Typescript 数组的 JSON 数组

    我正在使用 Angular 5 开发一个网络应用程序 我有 JSON 文件 如下所示 id 0 title Some title id 1 title Some title 该文件存储在本地 我也有一个界面 export interface
  • 一侧呈一定角度的背景正方形[重复]

    这个问题在这里已经有答案了 我希望能够仅使用 CSS 创建一个透明背景 但一端有一个角度 我已经找到了各种方法来尝试做到这一点 但无法完全实现 我真的不想使用任何脚本 只想使用 CSS 背景图像需要如下所示 您可以使用边框来做到这一点 ht
  • 单例不适合获取 JDBC 连接吗?连接池有什么好的实现吗?

    我使用单例模式为我的独立应用程序获取 jdbc 连接 代码如下 public static synchronized MysqlConnect getDbCon if db null db new MysqlConnect return d