jdbc连接问题

whxnb518 2017-07-30 05:02:28
写了一个答题的小系统,之前运行的没有问题,今天更新数据库没事看了看项目,在build path里面发现了无效jar包我就给删掉了,可能是很久前导入的,点了一些一起删的,之后程序就跑不动了。
public Single getSingle(int id) throws Exception
{
Single s = null;
Connection conn = DBUtil.getConnection();
String sql ="select * from tyl.single where id=?";
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setInt(1, id);
ResultSet rs = ptmt.executeQuery();
while(rs.next())
{
s = new Single();
s.setQuestion(rs.getString("question"));
s.setA(rs.getString("A"));
s.setB(rs.getString("B"));
s.setC(rs.getString("C"));
s.setD(rs.getString("D"));
s.setAnswer(rs.getString("answer"));
}
DBUtil.closeConn(rs, ptmt, null, conn);
return s;
}

我每次查询都先建立连接,获得数据后就关闭连接。但是在第二次查询的时候就会报错。
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1187)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1182)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4035)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4004)
at pers.Tyl.dao.SingleDao.getSingle(SingleDao.java:17)
at pers.Tyl.action.SingleAction.get(SingleAction.java:11)
at pers.Tyl.test.test.main(test.java:17)

public static void main(String[] args)
{
SingleAction s = new SingleAction();
Single single = new Single();
try
{
for(int i = 0; i < 2; i++)
{
single = s.get(1);
}
System.out.println(single.getB());
} catch (Exception e)
{
e.printStackTrace();
}
}

如果没有循环而只查询一次就不会报错,或者把dao内的close方法注释掉也可以查询两次。我不明白每次都先获取连接为什么第二次查询会报错。
...全文
131 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen58683632 2017-07-30
  • 打赏
  • 举报
回复
你把获取conn写到静态块中了,然后方法返回静态块中产生的这个连接,然后你在第一个查询中可以正常获取这个连接,但是第一次查询之后你将连接关闭了,第二次你获取的还是静态块中的这个连接,但是它在你第一次查询中已经被关闭了,所以报错。建议使用c3p0
whxnb518 2017-07-30
  • 打赏
  • 举报
回复
这样貌似是可以了,很感谢。之前我程序确实跑成了。。。受你的启发我又去看了一下静态块的东西,然后现在我就理解不了为什么我之前程序可以跑成了
李德胜1995 2017-07-30
  • 打赏
  • 举报
回复
引用 2 楼 whxnb518 的回复:
这样的
private static Connection conn = null;
	static
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	public static Connection getConnection()
	{
		return conn;
	}
	public static void closeConn(ResultSet rs, PreparedStatement ps, Statement st, Connection con)
	{
		try
		{
	        if(rs != null)
	        {
	        	rs.close();
	        }
	        if(ps != null){
	        	ps.close();
	        }
	        if(st != null){
	        	st.close();
	        }
	        if(con != null){
	        	con.close();
	        }
		}
		catch (Exception e)
		{
			e.printStackTrace();
	    }
	}

private static Connection conn = null;删掉。。。
conn = DriverManager.getConnection(URL, USER, PASSWORD);放到getConnection()方法里
getConnection()方法里return DriverManager.getConnection(URL, USER, PASSWORD);
whxnb518 2017-07-30
  • 打赏
  • 举报
回复
这样的
private static Connection conn = null;
	static
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	public static Connection getConnection()
	{
		return conn;
	}
	public static void closeConn(ResultSet rs, PreparedStatement ps, Statement st, Connection con)
	{
		try
		{
	        if(rs != null)
	        {
	        	rs.close();
	        }
	        if(ps != null){
	        	ps.close();
	        }
	        if(st != null){
	        	st.close();
	        }
	        if(con != null){
	        	con.close();
	        }
		}
		catch (Exception e)
		{
			e.printStackTrace();
	    }
	}
李德胜1995 2017-07-30
  • 打赏
  • 举报
回复
DBUtil怎么写的???

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧