# Connection Pool Hikari



## Selmau (20. Aug 2017)

Hallo Zusammen

Ich möchte über einen Hikari Connection Pool Verbindung zu meiner Datenbank Herstellen. Dies habe ich auch geschafft und die Connection steht. Das Problem ist nur, dass ich sobald ich ein PreparedStatement  ausführen möchte, dies nicht möglich ist über den Hikari Connection Pool.
Ich muss irgendetwas in der Configuration des Connection Pools ändern, ich habe schon Properties für den PreparedStatementCache hinzugefügt aber es funktioniert immer noch nicht. Hat jemand von euch eine Idee wie ich dieses Problem beheben kann.

Hier mein Code:


```
public class pool_connection {

    private static final String DB_USERNAME="db.username";
    private static final String DB_PASSWORD="db.password";
    private static final String DB_URL ="db.url";
    private static final String DB_DRIVER_CLASS="driver.class.name";
   
    private static Properties properties = null;
    private static HikariDataSource dataSource;
    static{
        try {
            properties = new Properties();
            properties.load(new FileInputStream("src/database.properties"));
     
            dataSource = new HikariDataSource();
          
            dataSource.setDriverClassName(properties.getProperty(DB_DRIVER_CLASS));
            dataSource.setJdbcUrl(properties.getProperty(DB_URL));
            dataSource.setUsername(properties.getProperty(DB_USERNAME));
            dataSource.setPassword(properties.getProperty(DB_PASSWORD));
           
           
             
          
            dataSource.setMinimumIdle(1);
            dataSource.setMaximumPoolSize(2000);//The maximum number of connections, idle or busy, that can be present in the pool.
           
             
            dataSource.addDataSourceProperty("cachePrepStmts", "true");
            dataSource.addDataSourceProperty("prepStmtCacheSize","250");
            dataSource.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
            dataSource.addDataSourceProperty("useServerPrepStmts", "true");
            dataSource.addDataSourceProperty("useLocalSessionState","true");
            dataSource.addDataSourceProperty("useLocalTransactionState","true");
            dataSource.addDataSourceProperty("rewriteBatchedStatements","true");
            dataSource.addDataSourceProperty("cacheResultSetMetadata","true");
            dataSource.addDataSourceProperty("cacheServerConfiguration","true");
            dataSource.addDataSourceProperty("elideSetAutoCommits","true");
            dataSource.addDataSourceProperty("maintainTimeStats","true");
           
           
          
           
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    public static DataSource getDataSource(){
        return dataSource;
    }
}
```


Hier aus Ausführen der Connection und der SQL Query mit einem PreparedStatement:

```
try {
                  
                  Connection connection = null;
                 connection = pool_connection.getDataSource().getConnection();
                 String query = "INSERT INTO `produkte_snf` (`product_id`, `Produkt`, `Preis`) VALUES ('88', 'test', '26.00') ";
            
                   
                    PreparedStatement pst_insert=(PreparedStatement) connection.prepareStatement(query);
                   
                    pst_insert.execute();
                
                   
                 if (connection == null){
                     JOptionPane.showMessageDialog(null, "Keine Verbindung");
                    
                 }
                 else{
                 JOptionPane.showMessageDialog(null, "Daten gesendet");}
                   
                   
               
                   
                }catch(Exception e) {
                    JOptionPane.showMessageDialog(null, "Fehler");
                }
```


Freundliche Grüsse

Selmau


----------



## mrBrown (20. Aug 2017)

„Nicht möglich“ bedeutet was?


----------



## Selmau (20. Aug 2017)

Das heisst, dass wenn ich nachdem ich die Connection  beschrieben habe ein PreparedStatement connection.preparedStatement  aufrufe, dass dasProgramm dann immer in den catch block geht, da es den try Block nicht fertig ausführen kann.


----------



## mrBrown (20. Aug 2017)

Lass dir doch mal im catch-Block die wirkliche Exception ausgeben.
Du fängst einfach alle, du weißt also gar nicht, was der Fehler ist, das könnte auch eine NullPointerException sein


----------



## Selmau (20. Aug 2017)

Der Fehler lautet von Eclipse: 
java.lang.ClassCastException:com.zaxxer.hikari.pool.HikariProxyPreparedStatement cannot be cast to com.mysql.jdbc.PreparedStatement


----------



## mrBrown (20. Aug 2017)

Und was sagt dir die Fehlermeldung?


----------



## Selmau (20. Aug 2017)

Genau dies möchte ich selber wissen, da ich daraus schliessen könnte, was genau ich ändern muss. Ich finde mit dem Fehlercode eine Lösung für dieses Problem.


----------



## mrBrown (20. Aug 2017)

prepareStatement gibt dir eine java.sql.PreparedStatement zurück - das versuchst du unsinnergerweise zu com.mysql.jdbc.PreparedStatement zu casten.

Du kannst den Cast einfach weglassen und stattdessen die passenden Imports nutzen.


----------

