1

我写了一个单例类来获取连接。但是,我无法使用 Singleton 获得连接。

我想使用我的 Singleton 获取多个连接并使用连接 Singleton 对数据库进行查询。我总是为此尝试几种方法,但没有成功。

这是我的单例类:

import java.sql.*;

public class ConnectDB {

private static Connection connect;
private static ConnectDB instance;

private ConnectDB()
{

    try {

        Class.forName("com.mysql.jdbc.Driver");
        //connect DB
        connect = DriverManager.getConnection("jdbc:mysql://ip/database","root","password");

    }

    catch(SQLException e)
    {
        System.err.println(e.getMessage());

    }

    catch(ClassNotFoundException e)
    {

        System.err.println(e.getMessage());

    }   
}

  public static ConnectDB getInstance()
  {

      if(instance == null) {

          instance = new ConnectDB();

      }

      return instance;

  }

}

现在,我得到了连接:

 public class NameClass {




public void getInfoDatabase()
{   

       Connection cnn = ConnectDB.getConnection();
       PreparedStatement ps;
       ResultSet rs;

       try {

           ps = cnn.prepareStatement("select *  from tables");

           rs = ps.executeQuery();

           while(rs.next())
           {

               String tables = rs.getString("table1");
               System.out.println(tables);
           }
4

3 回答 3

9

如果您想有效地使用多个连接,您可能需要一个连接池

在软件工程中,连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用连接。连接池用于提高在数据库上执行命令的性能。

拥有一个Singletonwhich 将返回许多连接违背了 的目的Singleton,它的任务是在调用它时提供相同的实例。

我建议您看一下这个先前的 SO 线程,其中讨论了各种连接池库。

于 2012-07-31T06:06:26.783 回答
1

我的方式是这个 DBConnection 是一个单例类。这个用法在 ContactDAO 类中。

public class DBConnection{

    private static DBConnection instance;
    private String url="jdbc:oracle:thin:@192.168.10.32:1521:orcl";
    private String login="kit";
    private String pass="1234";

    private DBConnection(){

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        if (instance == null) {
            instance = new DBConnection();
            System.out.println(" Connection  - - - - - - - -  New DBConnection created");
        }
        try {
            return DriverManager.getConnection(instance.url, instance.login,instance.pass);
        } catch (SQLException e) {
            throw e;
        }
    }

    public static void close(Connection connection)
    {
        try {
            if (connection != null) {
                connection.close();
                connection=null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

********* 联系道 *************

public class ContactDAO {


        public List<Contact> findAll() {
            List<Contact> list = new ArrayList<Contact>();
            Connection c = null;
            String sql = "SELECT * FROM KIT.CONTACT";
            try {
                c = DBConnection.getConnection();
                Statement s = c.createStatement();
                ResultSet rs = s.executeQuery(sql);
                while (rs.next()) {
                    list.add(processRow(rs));
                }
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
            return list;
        }

        public List<Contact> findByCity(String city) {
            List<Contact> list = new ArrayList<Contact>();
            Connection c = null;
            String sql = "SELECT * FROM KIT.CONTACT as e " + "WHERE UPPER(city) LIKE ? ";
            try {
                c = DBConnection.getConnection();
                PreparedStatement ps = c.prepareStatement(sql);
                ps.setString(1, "%" + city.toUpperCase() + "%");
                ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                    list.add(processRow(rs));
                }
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
            return list;
        }

        public Contact findById(int id) {
            String sql = "SELECT * FROM KIT.CONTACT WHERE id = ?";
            Contact contact = null;
            Connection c = null;
            try {
                c = DBConnection.getConnection();
                PreparedStatement ps = c.prepareStatement(sql);
                ps.setInt(1, id);
                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    contact = processRow(rs);
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
            return contact;
        }

        public Contact save(Contact contact) {
            return contact.getId() > 0 ? update(contact) : insert(contact);
        }

        public Contact insert(Contact contact) {
            Connection c = null;
            PreparedStatement ps = null;
            try {
                c = DBConnection.getConnection();
                ps = c.prepareStatement(
                        "INSERT INTO KIT.CONTACT (country, city, address, photo,fk_user) VALUES (?, ?, ?, ?, ?)",
                        new String[] { "ID" });

                ps.setString(1, contact.getCountry());
                ps.setString(2, contact.getCity());
                ps.setString(3, contact.getAddress());
                ps.setString(4, contact.getPhoto());
                ps.setInt(5, contact.getFk_user());

                ps.executeUpdate();

                ResultSet rs = ps.getGeneratedKeys();
                while(rs.next()){
                int id = rs.getInt(1);
                contact.setId(id);
                }


            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
            return contact;
        }

        public Contact update(Contact contact) {
            Connection c = null;
            try {
                c = DBConnection.getConnection();
                PreparedStatement ps = c
                        .prepareStatement("UPDATE KIT.CONTACT SET country=?, city=?, address=?, photo=?  WHERE id=?");
                ps.setString(1, contact.getCountry());
                ps.setString(2, contact.getCity());
                ps.setString(3, contact.getAddress());
                ps.setString(4, contact.getPhoto());

                ps.setInt(5, contact.getId());
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("contactDAO update exception");
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
            return contact;
        }

        public boolean remove(int id) {
            Connection c = null;
            try {
                c = DBConnection.getConnection();
                PreparedStatement ps = c
                        .prepareStatement("DELETE FROM KIT.CONTACT WHERE id=?");
                ps.setInt(1, id);
                int count = ps.executeUpdate();
                return count == 1;
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                DBConnection.close(c);
            }
        }

        protected Contact processRow(ResultSet rs) throws SQLException {
            Contact contact = new Contact();
            contact.setId(rs.getInt("id"));
            contact.setCountry(rs.getString("country"));
            contact.setCity(rs.getString("city"));
            contact.setAddress(rs.getString("address"));
            contact.setPhoto(rs.getString("photo"));

            return contact;

        }







    }
于 2016-06-22T13:26:27.920 回答
0

最好有一个像ComboPooledDataSource这样的单例类连接池,然后从中获取多个连接。

于 2012-07-31T06:06:27.347 回答