0

これはクラスのコンストラクターの1つです。新しいオブジェクトは、データベースに新しいレコードを作成します。このオブジェクトをソースコードで「手動で」作成すると、すべて問題ありません。しかし、作成の宣言をボタンのactionlistenerに入れると、コンパイラはsql例外を返します。

public Pacjent()
    {
        try
        {
            Connection conn = DataBase.Connect();
            Statement stat = conn.createStatement();
            String addRecord = "INSERT INTO records VALUES (12365, 'Bond', 'James', 'M', '12.41.1953r', 'Londyn', 'none');";
            stat.executeUpdate(addRecord);        
    }
    catch(SQLException e)
    {
        e.printStackTrace();
    }    

}

私が得る例外は

org.postgresql.util.PSQLException:この接続は閉じられました。org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:714)at org.postgresql.jdbc3.AbstractJdbc3Connection.createStatement(AbstractJdbc3Connection.java:230)at org.postgresql.jdbc2.Abs )at klasySilnika.Pacjent。(Pacjent.java:61)at klasyInterfejsu.NowaKarta $ 1.actionPerformed(NowaKarta.java:155)at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)at javax.swing.AbstractButton $ Handler .actionPerformed(AbstractButton.java:2341)at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)atjavax.swing.plaf。

これはactionlistenerです:

saveButton.addActionListener
        (
            new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent event) 
                {
                    Pacjent nowy = new Pacjent();
                }
            }
        );

Database.Connectメソッド:

public class DataBase 
{
    public static Connection Connect()
    {
        return CONNECTION;
    }        

    private static Connection CONNECTION = CreateConnection();

    private static Connection CreateConnection() 
    {
        try 
        {
            Class.forName("org.postgresql.Driver");

            Properties props = new Properties();
            FileInputStream in = new FileInputStream("D:\\projekty\\Arch\\src\\klasySilnika\\bazadanych.properties");
            props.load(in);
            in.close();

            String drivers = props.getProperty("jdbc.drivers");
            if(drivers != null) System.setProperty("jdbc.drivers", drivers);
            String url = props.getProperty("jdbc.url");
            String username = props.getProperty("jdbc.username");
            String password = props.getProperty("jdbc.password");

            return DriverManager.getConnection(url, username,password);
        }
        catch (ClassNotFoundException e) 
        {
            System.out.println("NO JDBC driver");
        return null;
    }
        catch(IOException e)
        {
            System.out.println("Where is properties file?");
            return null;
        } 
        catch(SQLException e)
        {
            System.out.println("error: adress, user, password?");
            return null;
        }
        finally
        {
           // ...   
        }
    }
}
4

2 に答える 2

3

接続が静的であるため、接続インスタンスが他の場所で閉じられている可能性があります。アプリケーション全体が接続の1つのインスタンスのみであるため、接続をマルチインスタンスに変更したり、データソースで管理したりできます(例:c3p0、dhcp)。

于 2012-05-29T08:51:46.160 に答える
-1
public Pacjent()
{
    try
    {
        Connection conn = DataBase.**CreateConnection**();
        Statement stat = conn.createStatement();
        String addRecord = "INSERT INTO records VALUES (12365, 'Bond', 'James', 'M', '12.41.1953r', 'Londyn', 'none');";
        stat.executeUpdate(addRecord);        
}
catch(SQLException e)
{
    e.printStackTrace();
}    

}

メソッドをCreateConnectionに変更できます

于 2019-02-20T17:57:38.220 に答える