1

接続を取得するための 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

複数の接続を効率的に使用したい場合は、接続プールの後にいる可能性があります。

ソフトウェア エンジニアリングでは、接続プールは、データベースへの将来の要求が必要になったときに接続を再利用できるように維持されるデータベース接続のキャッシュです。接続プールは、データベースでコマンドを実行する際のパフォーマンスを向上させるために使用されます。

多くの接続Singletonを返すを持つことは、呼び出されるたびに同じインスタンスを提供するという の目的に反します。Singleton

さまざまな接続プール ライブラリについて説明しているこの以前の SO スレッドを参照することをお勧めします。

于 2012-07-31T06:06:26.783 に答える
1

私のやり方は、この DBConnection は Singleton クラスです。これの使用法は 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();
        }
    }

}

********* ContactDAO *************

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 に答える