目录
一、出现问题:
二、尝试解决:
三、发现问题:
四、解决方法:
一、出现问题:
在写一个数据库的大作业时,在idea中连接mysql后,测试insert的dao方法,在控制台没有报错,显示题添加数据成功.但是在navicat中刷新表格却没有数据. (本程序为普通的三层架构,手搓JDBC)
二、尝试解决:
1.修改jdbc.properties配置文件.
2.修改数据库配置.
3.检查各处代码.
于是在掰头了一整晚后,第二天用同学的代码却发现可以正常连接,于是在进行一个一个类代码替换后,相同的jdbc.properties,相同的数据库表……终于发现是util包下的代码问题。
三、发现问题:
1.由于是直接搬运在学习尚硅谷JavaWeb时写的代码,所以在JdbcUtils类中,采用了Filter处理事务的数据库连接方式,原因是原本用在过滤器上的事务的提交和回滚,在没有使用过滤器时就出现了问题。
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();
}
}
四、解决方法:
将过滤器获取连接方法去掉.
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();
}
}
}
}