我现在做一个java应用程序,不是b/s的.需求是用quartz,根据任务
列表,定时对db做比较频繁,并且有点耗时的操作。
这种情况下,那我需要用连接池吗?还是用长连接,长Statement,我甚至可以不关闭他们,等程序停止的时候才关闭Statement 和connection.
感觉长连接效率应该比连接池高点.因为我们的系统不用考虑,连接断掉自动重连的功能,所以觉得用连接池更每什么意义啊!只是我想不明白如果我的整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?

解决方案 »

  1.   

    有没有意义 你自己试试就知道了啊
    apache的dbcp或c3p0
      

  2.   

    需求是用quartz,根据任务列表,定时对db做比较频繁,并且有点耗时的操作。 quartz定时器不就是多线程的吗?
      

  3.   

    只是我想不明白如果我的整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
      

  4.   


    我怎么测试啊?
    我不明白如果整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
      

  5.   

    我不明白如果整个系统只有一个static 的connecion的话,如果某个时间点,有两个线程,同时操作DB,会发生什么啊,会因为只有一个connection而等待吗?
      

  6.   

    看这里:http://www.open-open.com/20.htm
      

  7.   

    数据库内置的确实有些锁,比如有的有读锁和写锁.
    这两个线程操作同一connection会有什么情况还是要看数据库的吧.
    感觉如果你只有两个线程的话还是自己锁一下吧.
      

  8.   


    你知道static是类共享的么?如果你的代码不是线程安全的,那你就犯错误了。还有你的quartz是有执行频率的,如果要求的越精确就越耗费性能。
      

  9.   

    多线程一定要用这个(推荐),由于只有一个connection需要你手动调节,好让当两个线程同时操作的时候有一个等待。另外把他弄成static的主要目的是防止他乱占用资源,因为如果每个连接都建立一个connection的化很好资源(即使有垃圾回收机制)。
    连接池主要解决并发访问以及重复访问相同资源的问题(提高访问效率,一定程度上相当于缓存)。用于不用,因人而异
      

  10.   

    //大量访问数据库的时候连接池相当重要,一个也是效率原因。二个不用连接池,我下面的程序循环一万次,系统就崩溃,
    //无法连接了,必须重启服务器。
    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);
    }}