Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无框架的HikariCP_Java_Mysql_Hikaricp - Fatal编程技术网

Java 无框架的HikariCP

Java 无框架的HikariCP,java,mysql,hikaricp,Java,Mysql,Hikaricp,我第一次在Java中使用HikariCP,但没有使用任何后端框架或JPA 我的项目具有以下包结构 ----db ----controllers ----views ----models ----handlers 在db.DBManager.java中设置hikari数据源: public class DBManager { final protected HikariDataSource hikariDS; protected Connection connection = null; pu

我第一次在Java中使用HikariCP,但没有使用任何后端框架或JPA

我的项目具有以下包结构

----db
----controllers
----views
----models
----handlers
db.DBManager.java
中设置hikari数据源:

public class DBManager {
final protected HikariDataSource hikariDS;
protected Connection connection = null;

public DBManager() {

    String resourceName = "re/iprocu/coperativeerp/config/db/dbSettings.properties"; // could also be a constant
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    Properties props = new Properties();
    try(InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
        props.load(resourceStream);
    } catch (IOException ex) {
        Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
    }
    final HikariConfig hikariConfig = new  HikariConfig(props);
    //hikariConfig.setConnectionInitSql(absoluteFilePath);
    hikariConfig.setMaximumPoolSize(30);
    hikariConfig.setMinimumIdle(10);
    hikariConfig.setPoolName("TripPool");
    hikariConfig.setConnectionTimeout(1000);
    hikariConfig.setConnectionTestQuery("SELECT 1");
    hikariConfig.setAutoCommit(true);
    hikariConfig.setInitializationFailFast(false);
    hikariConfig.setLeakDetectionThreshold(2000);
    this.hikariDS = new HikariDataSource(hikariConfig);
}
}
处理程序中
包是对数据库进行查询的地方。 处理程序类扩展DBManager以获得初始化的hikari数据源

package re.iprocu.coperativeerp.handlers;
public class InventoryHandler extends DBManager{

   final static private Logger logger = Logger.getLogger(SupplierHandler.class.getName());

public InventoryHandler(){
    super();
} 


public int addProductToInventory(Inventory inv){
    int key = 0;

    PreparedStatement ps = null;
    try{
        connection  = hikariDS.getConnection();
        ps = connection.prepareStatement(sql);

        ps.executeUpdate();

        generatedKeys = ps.getGeneratedKeys();
        if (generatedKeys != null && generatedKeys.next()) {
            key = generatedKeys.getInt(1);
        } else {
            System.out.println("No Key");
        }
    }catch(SQLException e){ e.printStackTrace();}
    finally{
        if( connection != null ){
            try {connection.close();} 
            catch (SQLException ex) {logger.log(Level.SEVERE, null, ex);}
        }
        if( ps != null){
            try { ps.close();} 
            catch (SQLException ex) { logger.log(Level.SEVERE, null, ex);}
        }
    }

    return key;
}
}
controllers
包中,我定义并初始化需要使用的处理程序,并调用相应的方法

问题是在刷新ui或有时首次加载后,抛出并出错
java.sql.SQLTransientConnectionException:TripPool-连接不可用,请求在1001ms后超时。

原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多”

根据我的项目结构,配置HikariCP并最大限度地利用它的最佳方式是什么

编辑:
我发现这个stackoverflow对我有效,尽管我担心解决方案有一个未在讨论中解决的
双重检查锁定
问题,我不知道如何解决该问题

您的错误消息说,您的数据库当前打开的连接太多。所以,首先您可以查阅数据库文档并增加连接限制。或者和你的DB管理员谈谈,如果你有

可能的原因是您为
DBManager
的任何子类的每个新实例创建了新的数据源。将您的
hikariDS
设置为静态字段,并在静态块中对其进行初始化:

public class DBManager {
  public static final HikariDataSource hikariDS;

  static {
    String resourceName = "re/iprocu/coperativeerp/config/db/dbSettings.properties";
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    Properties props = new Properties();
    try(InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
      props.load(resourceStream);
    } catch (IOException ex) {
      Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
    }

    final HikariConfig hikariConfig = new  HikariConfig(props);
    hikariConfig.setMaximumPoolSize(30);
    hikariConfig.setMinimumIdle(10);
    hikariConfig.setPoolName("TripPool");
    hikariConfig.setConnectionTimeout(1000);
    hikariConfig.setConnectionTestQuery("SELECT 1");
    hikariConfig.setAutoCommit(true);
    hikariConfig.setInitializationFailFast(false);
    hikariConfig.setLeakDetectionThreshold(2000);
    DBManager.hikariDS = new HikariDataSource(hikariConfig);
  }
}

我还删除了
连接
字段。您最好将其存储在方法的局部变量中。

有多少个Hikari实例?您使用的是什么web服务器?已安装XAMPP,因此使用Apache。。。。Hikari实例,我不确定,但我想我调用创建Hikari的DBManager的方式有很多?如何维护它?您创建的每个类实例都会重新创建数据源,基本上每次添加10个连接。您应该一次性创建
数据源
,并在整个应用程序中重用。哇!注意打开…我更新了一个stackoverflow问题的链接,维护了一个DataSource实例…虽然根据公认的答案,
双重检查锁定
问题可能会发生,但我仍然不知道如何解决…可以吗?没有DB管理员,只是我…缩小连接池并没有解决问题。我想也许这就是我自己创建游泳池的方式?这方面有什么建议吗?对我来说似乎没问题。。。您是否尝试在DBAs M中增加连接限制。Deinum评论说,连接过多的问题是因为我创建了许多
HikariDataSource
实例,每次创建时都会添加10个连接。我更新了一个指向stackoverflow问题的链接,维护DataSource的一个实例…尽管根据公认的答案,可能会出现双重检查锁定问题,但我仍然不知道如何解决…您可以吗?@YunusEinsteinium我已经更新了我的答案。我相信我现在明白了你麻烦的真正根源:)