我在下面有一个基本的代码片段,但它不起作用。它可能有什么问题。
public List<String> getStores() throws SQLException{
List<String> store_id=new ArrayList<>();
String query="select distinct(store_id) from stores";
Connection con=ConnectDatabase.getDb2ConObj();
Statement stmt=con.createStatement();
java.sql.ResultSet rsResultSet=stmt.executeQuery(query);
while(rsResultSet.next()){
store_id.add(rsResultSet.getString(1));
}
con.close();
return store_id;
}
抛出以下异常
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
at com.mysql.jdbc.Connection.checkClosed(Connection.java:1931)
at com.mysql.jdbc.Connection.createStatement(Connection.java:3087)
at com.mysql.jdbc.Connection.createStatement(Connection.java:3069)
at com.dao.StoreDao.getStores(StoreDao.java:52)
at org.apache.jsp.adminViewAllStore_jsp._jspService(adminViewAllStore_jsp.java:119)
ConnectDatabse的代码是
public class ConnectDatabase {
static Connection con=null;
static String connectionString="jdbc:mysql://localhost:3306/ayurveda";
static String username="root";
static String password="";
public static Connection getDb2ConObj(){
if(con==null){
try{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection(connectionString,username,password);
}
catch(ClassNotFoundException | SQLException e)
{
System.out.println("Connect initialized with error"+e.getMessage());
e.printStackTrace();
}
}
return con;
}
我无法理解同样的原因。可能是什么问题。因为我在完成之后关闭连接。
答案 0 :(得分:0)
在我将其括在try catch finally
块中后,它工作了。更改了下面给出的代码
public List<String> getStores() throws SQLException{
List<String> store_id=new ArrayList<>();
Connection con=ConnectDatabase.getDb2ConObj();
try{
String query="select distinct(store_id) from stores";
Statement stmt=con.createStatement();
java.sql.ResultSet rsResultSet=stmt.executeQuery(query);
while(rsResultSet.next()){
store_id.add(rsResultSet.getString(1));
}
}catch(Exception e){
}finally{
con.close();
}
return store_id;
}
感谢。
答案 1 :(得分:0)
使用Java 7 -The try-with-resources Statement
根据oracle documentation,您可以将try-with-resources块与常规try块结合使用
典型的Java应用程序操纵几种类型的资源,例如文件,流,套接字和数据库连接。这些资源必须小心处理,因为它们为其操作获取系统资源。因此,您需要确保即使出现错误也可以释放。
实际上,不正确的资源管理是生产应用程序中常见的失败原因,通常陷阱是数据库连接,并且在代码中的其他位置发生异常后,文件描述符仍保持打开状态。这导致应用程序服务器在资源耗尽时经常重新启动,因为操作系统和服务器应用程序通常具有资源的上限。
示例代码:
try(Connection con = getConnection()) {
...
}
了解更多Java 7 Automatic Resource Management JDBC
关闭Statement
和ResultSet
。
每次需要连接时都不要加载驱动程序类。只需在静态初始化块中加载一次。
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
我建议您使用JNDI和DataSource将用户名和密码保留在Java代码之外,以使其更易于管理。将数据库配置保存在单独的xml / properties文件中,而不是Java文件中的硬编码。
请参阅Connecting with DataSource Objects
上的 Java Tutorial我已经发布了一个很好的ConnectionUtil类来管理整个应用程序的单个类中的所有连接。
答案 2 :(得分:0)
您可以使用此类代码...来解决您的问题
public void actionPerformed(ActionEvent ae)
{
String u=t1.getText();
String p=t2.getText();
if(ae.getSource()==b1)
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:newdsn");
String stp="SELECT * FROM reg";
Statement sa=con.createStatement();
rs=sa.executeQuery(stp);
while(rs.next())
{
String du=rs.getString(2);
String dp=rs.getString(3);
if(du.equals(u)&&dp.equals(p))
{
a=0;
break;
}else{ a=1;}
}
if(a==0){
JOptionPane.showMessageDialog(this,"LOGIN PAGE","Login is successful",1);
}
if(a==1){
JOptionPane.showMessageDialog(this,"LOGIN PAGE","Login is not successful",1);
}}
catch(Exception e){}
}}
如果即使它正在抛出异常,那么你检查系统32位或64位..你应该尝试64位然后请使你的dsn在32位和使用ms访问2002-2003版本
然后你得到旅游解决方案.....谢谢你