1

指定した部分に同時にアクセスできるユーザーが 1 人だけになるように、mysql クエリを同期する必要があります。試しsynchronized(){}ましたが、これはうまくいきません。ユーザーはメソッドに同時にアクセスできます。これは tomcat6 を使用した jsp Web アプリケーションです。あまりにも多くのユーザーが同時にクエリを実行すると Web サーバーがクラッシュするため、これが必要です。

String sql = "SELECT * FROM products;"
ResultSet rs;

//This block should be synchronized
Statement s = con.createStatement();
rs = s.excecuteQuery(sql);

while (rs.next()) {
// do some stuff..
}

助けてくれてありがとう。

編集:同期しようとした方法

public class connect {

public static String URL = "url";
public static String USER = "root";
public static String PASSWORD = "password";
private Object lock = new Object();

public void getData() {

    Connection con;

    try {
        con = DriverManager.getConnection(URL, USER, PASSWORD);
        String sql = "SELECT * FROM products;";
        ResultSet rs;

        //This block should be synchronized
        synchronized(lock) {
            Statement s = con.createStatement();
            rs = s.executeQuery(sql);

            while (rs.next()) {
            // do some stuff..
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}

lockオブジェクトはサーバーに保存する必要があると思います。しかし、これを行う正しい方法は何ですか?

4

5 に答える 5

1

lock処理中のすべてのリクエストでオブジェクトが同じであれば、コードは問題ありません。

どうやってそれを理解できますか?connect処理するリクエストごとに新しいクラスを作成すると、このクラスの各インスタンスには異なるlockがあり、同期ブロックは異なるインスタンスによって同時に実行できます。

connectクラスのインスタンスが 1 つしかない場合は、インスタンスも1 つしかlockなく、2 つのスレッドが同期ブロックを同時に実行できないことが確実です。

ただし、クラスのインスタンスが 1 つしかない場合でもconnect、コードのリファクタリングによってこのクラスの複数のインスタンスが作成されると、同期が簡単に壊れてしまいます。このコードがすべてのスレッドに対して確実にロックされるようにするには、ロック オブジェクトを static として宣言する必要があります。

static final Object LOCK = new Object();

LOCKこれで、JVM に1 つしかないことがわかりました。

また、アプリケーションがクラスターで実行されている場合、同じアプリケーションを実行している複数の JVM があるため、Java 同期が機能しないことにも注意する必要があります。この件に関する詳細については、この質問をご覧ください。

ところで、クラスの命名規則に従うようにしてください。クラス名は大文字で始める必要があるため、クラスの名前を に変更しますConnect

于 2013-06-07T10:12:19.037 に答える
0

メソッドをどのように同期したかわかりません。ただし、メソッドを含むクラスがシングルトンでない限り、機能しません。

これが機能するには、それがシングルトンであるか、メソッドをロックするために使用しているオブジェクトである必要があります。

メソッドを単純に同期すると、クラスの複数のインスタンスが意図を妨害します。

しかし、あなたのアーキテクチャには何か問題があるようです。ある種の接続マネージャーを使用していますか?

于 2013-06-07T09:10:51.363 に答える
0

DBCP を使用している場合は、maxActive属性をデフォルトで 100 に設定するだけです。制限を超える接続を取得しようとしているスレッドはブロックされます。

于 2013-06-07T09:13:13.740 に答える