我现在做一个java应用程序,不是b/s的.需求是用quartz,根据任务
列表,定时对db做比较频繁,并且有点耗时的操作。
这种情况下,那我需要用连接池吗?还是用长连接,长Statement,我甚至可以不关闭他们,等程序停止的时候才关闭Statement 和connection.
感觉长连接效率应该比连接池高点.因为我们的系统不用考虑,连接断掉自动重连的功能,所以觉得用连接池更每什么意义啊!只是我想不明白如果我的整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
列表,定时对db做比较频繁,并且有点耗时的操作。
这种情况下,那我需要用连接池吗?还是用长连接,长Statement,我甚至可以不关闭他们,等程序停止的时候才关闭Statement 和connection.
感觉长连接效率应该比连接池高点.因为我们的系统不用考虑,连接断掉自动重连的功能,所以觉得用连接池更每什么意义啊!只是我想不明白如果我的整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
apache的dbcp或c3p0
我怎么测试啊?
我不明白如果整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
这两个线程操作同一connection会有什么情况还是要看数据库的吧.
感觉如果你只有两个线程的话还是自己锁一下吧.
你知道static是类共享的么?如果你的代码不是线程安全的,那你就犯错误了。还有你的quartz是有执行频率的,如果要求的越精确就越耗费性能。
连接池主要解决并发访问以及重复访问相同资源的问题(提高访问效率,一定程度上相当于缓存)。用于不用,因人而异
//无法连接了,必须重启服务器。
package jdbcHibernateLink;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;public class ConnectionPool
{
private Vector<Connection> pool;
private String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=VRG;selectMethod=cursor";
private String username = "sa";
private String password = "123";
private String driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private int poolsize =10;
private static ConnectionPool instance = null;
private ConnectionPool()
{
init();
} private void init()
{
pool = new Vector<Connection>(poolsize);
addConnection();
}
public synchronized Connection getConnectin()
{
if(pool.size() > 0)
{
Connection con = pool.get(0);
pool.remove(con);
return con;
}
return null;
} public void addConnection()
{
for(int i = 0; i < poolsize; i++)
{
try
{
Connection con = null;
Class.forName(driverClassName);
if(con == null)
{
con = DriverManager.getConnection(url,username,password);
}
pool.add(con);
}
catch (Exception e)
{
System.out.print("?????");
e.printStackTrace();
System.exit(0);
}
}
} public static ConnectionPool getInstance()
{
if(instance == null)
{
instance = new ConnectionPool();
}
return instance;
}
public synchronized void release(Connection conn)
{
pool.add(conn);
}
public synchronized void closePool()
{
for(int i = 0; i < pool.size(); i++)
{
try
{
pool.get(i).close();
}
catch (Exception e)
{
e.printStackTrace();
}
pool.remove(i);
}
}
}package jdbcHibernateLink;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;public class teMain
{ public static void main(String[] args)
{
String sql = "select * from stu";
ConnectionPool pool = null;
long start = System.currentTimeMillis();
for (int i = 0; i < 5000; i++)
{
pool = ConnectionPool.getInstance();
Connection con = pool.getConnectin();
try
{
PreparedStatement prs = con.prepareStatement(sql);
ResultSet set = prs.executeQuery();
ResultSetMetaData data = set.getMetaData();
while (set.next())
{
}
set.close();
prs.close();
pool.release(con);
}
catch (Exception e)
{
System.exit(0);
e.printStackTrace();
}
}
System.out.println(System.currentTimeMillis() - start);
pool.closePool();
System.out.println("连接已关闭");
System.out.println("*********不用连接池**************");
long start2 = System.currentTimeMillis();
String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://127.0.0.1:1433; databaseName = VRG;selectMethod = cursor;";
String name = "sa";
String password = "123";
String sql1 = "select * from stu";
for (int i = 0; i < 2000; i++)
{
try
{
Class.forName(className); Connection c = DriverManager.getConnection(url, name, password); PreparedStatement ps = c.prepareStatement(sql1);
ResultSet re = ps.executeQuery();
while (re.next())
{
}
re.close();
ps.close();
c.close();
}
catch (Exception e)
{
e.printStackTrace();
System.exit(0);
}
}
System.out.println(System.currentTimeMillis() - start2);
}}