目次
1.問題があります:
次に、以下を解決してみます。
4 番目の解決策:
1. 問題があります:
大規模なデータベース ジョブを作成する場合、アイデアで mysql に接続した後、挿入の dao メソッドをテストすると、コンソールにエラーは発生せず、表示質問でデータが正常に追加されますが、navicat でテーブルを更新するとデータがありません(このプログラムは普通のプログラムです。3 層アーキテクチャ、手作業による JDBC)
次に、以下を解決してみます。
1. jdbc.properties 構成ファイルを変更します。
2. データベース構成を変更します。
3. あらゆる場所のコードをチェックします。
それで、一晩中頭を壊した後、翌日クラスメイトのコードを使用したところ、正常に接続できることがわかったので、コードを1つずつ置き換えた後、同じjdbc.properties、同じデータベーステーブル...ついに判明しましたそれが util パッケージであること 以下のコードの問題。
3. 問題が見つかりました:
1. JdbcUtilsクラスでは、Shang Silicon Valley JavaWebを学習した際に書いたコードをそのまま渡すため、フィルタで本来使用していたトランザクションのコミットやロールバックが利用できないため、フィルタ処理トランザクションのデータベース接続方式を採用しています。フィルターを使用すると問題が発生します。
2.
connection.close();//トランザクションの自動コミットを閉じます。
トランザクション管理では、トランザクションの「トランザクションの自動コミットを閉じる」というコード行により、取得されたデータベース接続がトランザクションを自動的にコミットしなくなります。
/**
* 提交事务,并关闭释放连接.
*/
public static void commitAndClose() {
Connection connection = conns.get();
if (connection != null) {
try {
connection.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();//关闭事务的自动提交.
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
conns.remove();
}
JdbcUtils ソース コード:
package com.my.util;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* @author sihua
* @create 2022-10-30-20:51
*/
public class JdbcUtilsFilter {
private static DruidDataSource dataSource;
private static ThreadLocal<Connection> conns = new ThreadLocal<>();
static {
try {
Properties properties = new Properties();
//读取jdbc.properties属性配置文件.
InputStream inputStream = JdbcUtilsFilter.class.getClassLoader().
getResourceAsStream("jdbc.properties");
//从流中加载数据
properties.load(inputStream);
//创建数据库连接池.
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
// System.out.println(dataSource.getConnection());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接池中的连接.
* 如果返回null,说明获取连接失败.
*/
public static Connection getConnection() {
Connection conn = conns.get();
if (conn == null) {
try {
conn = dataSource.getConnection();
conns.set(conn);
conn.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
/**
* 提交事务,并关闭释放连接.
*/
public static void commitAndClose() {
Connection connection = conns.get();
if (connection != null) {
try {
connection.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
conns.remove();
}
/**
* 关闭连接,放回数据库连接池
*/
// public static void close(Connection conn) {
// if (conn != null) {
// try {
// conn.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
// }
/**
* 回滚事务,并关闭释放连接.
*/
public static void rollBackAndClose() {
Connection connection = conns.get();
if (connection != null) {
try {
connection.rollback();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
conns.remove();
}
}
4 番目の解決策:
フィルター取得接続メソッドを削除します。
package com.my.util;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtils {
private static DruidDataSource dataSource;
static {
try {
Properties properties = new Properties();
// 读取 jdbc.properties属性配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 从流中加载数据
properties.load(inputStream);
// 创建 数据库连接 池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接池中的连接
* @return 如果返回null,说明获取连接失败<br/>有值就是获取连接成功
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭连接,放回数据库连接池
* @param conn
*/
public static void close(Connection conn){
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}