日期:2014-05-18  浏览次数:20690 次

高手来解释下为何这里只连接一次数据库
package db;
import java.sql.*;

public class Lianj {
static String url="jdbc:mysql://localhost/picture";
static String username = "root";
static String password = "48979879";
static Connection conn;
static Statement stmt;
   
static {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username,password);
stmt = conn.createStatement();

} catch(ClassNotFoundException e) {
System.out.println("驱动加载错误");
}
catch(SQLException e) {
System.out.println("数据库连接失败");
}

}

public ResultSet read(String sql) {
ResultSet rs=null;
try {
rs=stmt.executeQuery(sql);
} catch(SQLException e) {
rs=null;
e.printStackTrace();
}
return rs;
}
public int input(String sql) {
int i;
try {
i=stmt.executeUpdate(sql);
} catch(SQLException e) {
i=0;
e.printStackTrace();  
}
return i;
}
}

------解决方案--------------------
static语句块在实例化后只执行一次
------解决方案--------------------
所有static修饰的
在类里面都是共享的
既然是共享的
有没有必要创建多个共享的东西
------解决方案--------------------
static中的Connection在Class初始时就装入了,不论多少个实例,都不会再次执行.
------解决方案--------------------
用了static么,静态块呀-0-,我的理解就是该类被加载的时候就会初始化这个静态块,从此以后就重复引用了-0-比较糙的理解
------解决方案--------------------
游离于方法之外的代码有两种:
一种是静态代码块,就是楼主写的一个样.
一咱是实例代码块,就是没有static标答的代码如:
public class Persion{
private String name;

{
System.out.println( "Hello world ");
}
}

两种代码块的加载机制在jvm是不同的
静态代码码,只在类加载器第一次加载的时候执行.当然如果一个jvm中多个不同的类装载器,用不同的类装载器加载时,静态块会远行多次.

实例代码块,是在开辟堆空间的时候动行,每生成一个实例(new Persion()),就会远行一次.