No! No!!!! *PLEASE* do not check the DatabaseMetaData! This can
be VERY slow - 10 minutes or more - I've seen it! Sometimes I wake up in
the middle of the night in a cold sweat thinking about that Oracle
instance, but it was truly horrible and the DatabaseMetaData was too slow
to be usable. :) Actually, I think I've seen that twice before, at
different companies, with different horrible databases - but it's too
common to ignore.
Aaron
On Wed, 11 Oct 2000, jBoss CVS Development wrote:
> User: schulze
> Date: 00/10/11 12:40:42
>
> Modified: src/main/org/jboss/ejb/plugins/jaws/jdbc
> JDBCInitCommand.java
> Log:
> provided the PersistenceManager init() and destroy() methods with transactions, so
>that the table creation/deletion commands will affect the database.
> Furthermore I replaced the ugly hack for the table detection in the
>JDBCInitCommand with a j2ee spec compilant version (should work with all drivers).
>
> Revision Changes Path
> 1.7 +28 -23
>jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCInitCommand.java
>
> Index: JDBCInitCommand.java
> ===================================================================
> RCS file:
>/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCInitCommand.java,v
> retrieving revision 1.6
> retrieving revision 1.7
> diff -u -r1.6 -r1.7
> --- JDBCInitCommand.java 2000/09/28 01:17:04 1.6
> +++ JDBCInitCommand.java 2000/10/11 19:40:41 1.7
> @@ -14,7 +14,9 @@
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> +import java.sql.DatabaseMetaData;
>
> +
> import org.jboss.ejb.plugins.jaws.JPMInitCommand;
> import org.jboss.ejb.plugins.jaws.metadata.CMPFieldMetaData;
>
> @@ -26,7 +28,7 @@
> * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
> - * @version $Revision: 1.6 $
> + * @version $Revision: 1.7 $
> */
> public class JDBCInitCommand
> extends JDBCUpdateCommand
> @@ -65,29 +67,32 @@
> // Create table if necessary
> if (jawsEntity.getCreateTable())
> {
> - boolean created = false;
> - Connection con = null;
> - Statement st = null;
> - ResultSet rs = null;
> - try {
> - con = getConnection();
> - st = con.createStatement();
> - rs = st.executeQuery("SELECT COUNT(*) FROM
>"+jawsEntity.getTableName()+" WHERE 0=1");
> - if(rs.next())
> + // first check if the table already exists...
> + // (a j2ee spec compatible jdbc driver has to fully
> + // implement the DatabaseMetaData)
> + boolean created = false;
> + Connection con = null;
> + ResultSet rs = null;
> + try
> + {
> + con = getConnection();
> + DatabaseMetaData dmd = con.getMetaData();
> + rs = dmd.getTables(con.getCatalog(), null,
>jawsEntity.getTableName(), null);
> + if (rs.next ())
> created = true;
> - rs.close();
> - rs = null;
> - st.close();
> - st = null;
> - con.close();
> - con = null;
> - } catch(SQLException e) {
> - created = false;
> - } finally {
> - if(rs != null) try {rs.close();}catch(SQLException e) {}
> - if(st != null) try {st.close();}catch(SQLException e) {}
> - if(con != null) try {con.close();}catch(SQLException e) {}
> - }
> +
> + rs.close ();
> + con.close ();
> + }
> + catch(Exception e)
> + {
> + throw e;
> + }
> + finally
> + {
> + if(rs != null) try {rs.close(); rs = null;}catch(SQLException e) {}
> + if(con != null) try {con.close();con = null;}catch(SQLException e) {}
> + }
>
> // Try to create it
> if(created) {
>
>
>
>