gpt4 book ai didi

java - PrepareStatement/Commit 序列在 mysql/HikariCP webapp 中不起作用

转载 作者:可可西里 更新时间:2023-11-01 07:56:23 27 4
gpt4 key购买 nike

我有一个 Web 应用程序,它使用 MySQL 和 HikariCP 作为连接池。我使用如下定义的单例连接池对象连接到我的池:

package com.webapp.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.log4j.Logger;

public class HikariConnectionPool
{
private static final Logger log = Logger.getLogger(HikariConnectionPool.class.getName());
private static volatile HikariConnectionPool hikariCP = null;
private static HikariDataSource hikariDataSource = null;

private HikariConnectionPool() // We don't want any other object creating this pool
{
HikariConfig config = new HikariConfig();
config.addDataSourceProperty("url","jdbc:mysql://remoteMYSQLServer:3306/webapp");
config.addDataSourceProperty("user", "webapp");
config.addDataSourceProperty("password", "password");
config.setMinimumIdle(1);
config.setMaximumPoolSize(2);
config.setInitializationFailFast(true);
config.setConnectionTestQuery("VALUES 1");
config.setJdbcUrl("jdbc:mysql://remoteMYSQLServer:3306/webapp");
config.setDriverClassName ("com.mysql.jdbc.Driver");

hikariDataSource = new HikariDataSource (config);
}

public static HikariConnectionPool getInstance()
{
if (hikariCP == null)
{
synchronized (HikariConnectionPool.class)
{
if (hikariCP == null)
{
hikariCP = new HikariConnectionPool ();
}
}
}
return hikariCP;
}

public static HikariDataSource getDataSource ()
{
hikariCP = getInstance ();
return hikariDataSource;
}
}

在我的应用程序中,我使用以下代码获取数据源:

HikariDataSource ds = HikariConnectionPool.getDataSource ();

然后尝试使用

插入数据库
try {
Connection connection = ds.getConnection ();
String sString = "insert into webapp.sometable (?, ?, ?, ?, ?);";
PreparedStatement statement = connection.prepareStatement (sString);
statement.setString (1, fname);
statement.setString (2, sname);
statement.setString (3, email);
statement.setString (4, password);
statement.setString (5, phone);

statement.executeUpdate();
connection.commit ();
connection.close ();
} catch (SQLException e) { e.printStackTrace(); }

但我没有看到提交到数据库的值。我究竟做错了什么?非常感谢任何帮助。

最佳答案

您的带有双重检查锁定的 getInstance() 是不正确的,可能会导致竞争条件。参见 "Double-checked locking" on Wikipedia以获得正确的模式。

您的 SQL 语句不需要以分号结尾。并且它可能不需要使用架构“webapp”进行限定。因为您正在显式连接到 webapp 数据库。

此外,我将跳过构建数据源的驱动程序管理器版本并采用以下模式:

HikariConfig config = new HikariConfig();
config.setMinimumIdle(1);
config.setMaximumPoolSize(2);
config.setInitializationFailFast(true);
config.setConnectionTestQuery("VALUES 1");
config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
config.addDataSourceProperty("serverName", "localhost");
config.addDataSourceProperty("port", "3306");
config.addDataSourceProperty("databaseName", "webapp");
config.addDataSourceProperty("user", "webapp");
config.addDataSourceProperty("password", "password");

关于java - PrepareStatement/Commit 序列在 mysql/HikariCP webapp 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com