2017-07-08 7 views
0

準備済みの文をグローバルに初期化しています(関数が実行されるたびにプリコンパイルされず、アプリケーションがロードされているときのみ)。リソースを使って試しにpreparedstatementを作成しましたが、 'unknown class'エラーが表示されています。接続が別の方法で開いても、グローバルに宣言されて明確にするためにPreparedStatementをリソースで試してみると 'unknown class'エラーが表示される

private PreparedStatement ingredientDelete; 

public void deleteIngredient(String name) { 
    try(ingredientDelete = con.prepareStatement(DELETE_INGREDIENT_BY_NAME)){ 
     ingredientDelete.setString(1, name); 
     ingredientDelete.execute(); 

    }catch(SQLException e){ 
     System.out.println("Delete failed - " + e.getMessage()); 

    } 
} 

:これはコードです。

+1

完全なエラーメッセージを表示してください。 –

+0

私はintellijの一番下のメニューに入っていますが、この 'Error:(142、29)java: expected'は、=記号の直前の 'ingredientDelete'の最後を指しています。 –

答えて

3

これは有効なJavaではありません。 try内で宣言されたリソースは、ローカル変数でなければならず、その型が宣言されていなければなりません。文が接続にバインドされているのでthe JLS

Resource: 
    VariableModifiersopt Type VariableDeclaratorId = Expression 

が、それはフィールドがとにかく意味をなさない作る、そしてあなたがそれをする方法は、このように潜在的に使用して、とにかく呼び出されるたびに再作成しているので、参照してください。複数のスレッドで同じステートメント。

あなたはすべての悪の根源である、事前に最適化しています。データベースにはすでにプリペアドステートメントのキャッシュがあります。あなた自身でそれをする必要はありません。また、すべてのプログラムに単一の接続を使用する代わりに、接続プールも必ず使用してください。

+0

これは理にかなっていますが、私は準備されたステートメントをフィールドにすることを推奨しているビデオを見ました。これは、事前にコンパイルされたために定期的なステートメントよりもパフォーマンスが向上し、その改善を否定するでしょう。 また、接続プールを使用する方法について説明したチュートリアルや記事にリンクしてください。 –

関連する問題