I have issues when inserting data into a mysql database with jdbc. when adding a new user to the database, I get a new connection, create a prepared statement and execute the query. However, no results are shown in the database.
For example, let's assume I manually add a new user in the database with MySql Query Browser.
- I add a new user --> name = Stefano, pin = 1010
- An auto-increment id is generated: id = 1.
Suppose I decide to add a new user programmaticaly:
- I call the method addUser(String username, int pin) --> addUser("pippo", 7636);
- No error occurs
- I open MySql Query Browser and none user is added.
Finally I add a new user manually: name = pluto , pin = 3434.
Now my table result in:
| id | name | pin |
|---|---|---|
| 1 | stefano | 1010 |
| 3 | pluto | 3434 |
id=2 is missing. So pippo has been added but I can't see it.
What's wrong?
Here my java code simplified:
package simpleexample; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class SimpleExample { public static void addUser(String username, int pin) { Connection conn = null; PreparedStatement preparedStmt = null; String insertSQL = "insert into users(name, pin) values (?, ?)"; try { conn = DBConnectionPool.getConnection(); preparedStmt = conn.prepareStatement(insertSQL); preparedStmt.setString(1, username); preparedStmt.setInt(2, pin); preparedStmt.execute(); } catch (SQLException ex) { Logger.getLogger(SimpleExample.class.getName()).log(Level.SEVERE, null, ex); } finally { if (conn != null) { DBConnectionPool.releaseConnection(conn); } } } public static void main(String[] args) { addUser("pippo", 7636); } } Here the class DBConnectionPool:
package simpleexample; import java.util.*; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.*; /** * This class simulates a db connection pool */ public class DBConnectionPool { /* * This code prepare the db connection pool. In particular, it creates the * free connections queue and defines the db properties. */ static { freeDbConnections = new ArrayList<Connection>(); try { DBConnectionPool.loadDbProperties(); DBConnectionPool.loadDbDriver(); } catch (ClassNotFoundException e) { System.out.println("DB DRIVER NOT FOUND!"); System.exit(1); } catch (IOException e) { System.out.println("DB CONNECTION POOL ERROR!"); System.exit(2); } } /** * The db properties (driver, url, login, and password) */ private static Properties dbProperties; /** * The free connection queue */ private static List<Connection> freeDbConnections; /** * Returns a free db connection accessing to the free db connection queue. * If the queue is empty a new db connection will be created. * * @return A db connection * @throws SQLException */ public static synchronized Connection getConnection() throws SQLException { Connection connection; if (!freeDbConnections.isEmpty()) { // Extract a connection from the free db connection queue connection = freeDbConnections.get(0); DBConnectionPool.freeDbConnections.remove(0); try { // If the connection is not valid, a new connection will be // analyzed if (connection.isClosed()) { connection = DBConnectionPool.getConnection(); } } catch (SQLException e) { connection = DBConnectionPool.getConnection(); } } else // The free db connection queue is empty, so a new connection will // be created { connection = DBConnectionPool.createDBConnection(); } return connection; } /** * Releases the connection represented by <code>pReleasedConnection</code> * parameter * * @param pReleasedConnection The db connection to release */ public static synchronized void releaseConnection( Connection pReleasedConnection) { // Add the connection to the free db connection queue DBConnectionPool.freeDbConnections.add(pReleasedConnection); } /** * Creates a new db connection * * @return A db connection * @throws SQLException */ private static Connection createDBConnection() throws SQLException { Connection newConnection = null; // Create a new db connection using the db properties // newConnection = DriverManager.getConnection( // "jdbc:mysql://localhost/resources", "root", ""); newConnection = DriverManager.getConnection( DBConnectionPool.dbProperties.getProperty("url"), DBConnectionPool.dbProperties.getProperty("username"), DBConnectionPool.dbProperties.getProperty("password")); newConnection.setAutoCommit(false); return newConnection; } private static void loadDbDriver() throws ClassNotFoundException { Class.forName(DBConnectionPool.dbProperties.getProperty("driver")); } /** * Loads the db properties * * @throws IOException */ private static void loadDbProperties() throws IOException { InputStream fileProperties = new FileInputStream("database.properties"); DBConnectionPool.dbProperties = new Properties(); DBConnectionPool.dbProperties.load(fileProperties); } } Note: I have a file Database.properties in the project with
- driver=org.gjt.mm.mysql.Driver
- url=jdbc:mysql://localhost/name_db
- username=root
- password='password'
I already used the DBConnectionPool class in other projects and it's always worked fine. So I don't understand what's wrong. Maybe something about transactions?