7 Troubleshooting JDBC

The following sections describe some common issues when developing JDBC applications:

Problems with Oracle Database on UNIX

Check the threading model you are using. When using Oracle drivers, WebLogic recommends that you use native threads. You can specify this by adding the -native flag when you start Java.

Thread-related Problems on UNIX

On UNIX, two threading models are available: green threads and native threads. For more information, read about the JDK for the Solaris operating environment on the Sun Web site at http://www.java.sun.com.

You can determine what type of threads you are using by checking the environment variable called THREADS_TYPE. If this variable is not set, you can check the shell script in your Java installation bin directory.

Some of the problems are related to the implementation of threads in the JVM for each operating system. Not all JVMs handle operating-system specific threading issues equally well. Here are some hints to avoid thread-related problems:

  • If you are using Oracle drivers, use native threads.

  • If you are using HP UNIX, upgrade to version 11.x, because there are compatibility issues with the JVM in earlier versions, such as HP UX 10.20.

  • On HP UNIX, the new JDK does not append the green-threads library to the SHLIB_PATH. The current JDK can not find the shared library (.sl) unless the library is in the path defined by SHLIB_PATH. To check the current value of SHLIB_PATH, at the command line type:

    $ echo $SHLIB_PATH
    

    Use the set or setenv command (depending on your shell) to append the WebLogic shared library to the path defined by the symbol SHLIB_PATH. For the shared library to be recognized in a location that is not part of your SHLIB_PATH, you will need to contact your system administrator.

Closing JDBC Objects

Oracle recommends—and good programming practice dictates—that you always close JDBC objects, such as Connections, Statements, and ResultSets, in a finally block to make sure that your program executes efficiently. Here is a general example:

Example 7-1 Closing a JDBC Object

try {

Driver d = 
(Driver)Class.forName("oracle.jdbc.OracleDriver").newInstance();

Connection conn = d.connect("jdbc:weblogic:oracle:myserver",
                                  "scott", "tiger");

    Statement stmt = conn.createStatement();
    stmt.execute("select * from emp");
    ResultSet rs = stmt.getResultSet();
    // do work

    }

    catch (Exception e) {

      // handle any exceptions as appropriate

    }

    finally {

      try {rs.close();}
      catch (Exception rse) {}
      try {stmt.close();}
      catch (Exception sse) {}
      try {conn.close();
      catch (Exception cse) {}

    }

Abandoning JDBC Objects

You should also avoid the following practice, which creates abandoned JDBC objects:

//Do not do this.
stmt.executeQuery();
rs = stmt.getResultSet();

//Do this instead
rs = stmt.executeQuery();

The first line in this example creates a result set that is lost and can be garbage collected immediately.

Using Microsoft SQL Server with Nested Triggers

The following section provides troubleshooting information when using nested triggers on some Microsoft SQL Server databases:

For information on supported data bases and data base drivers, see the Oracle Fusion Middleware Supported System Configurations page at http://www.oracle.com/technology/software/products/ias/files/fusion_certification.html.

Exceeding the Nesting Level

You may encounter a SQL Server error indicating that the nesting level has been exceeded on some SQL Server databases.

For example:

   CREATE TABLE EmployeeEJBTable (name varchar(50) not null,salary int, card     
varchar(50), primary key (name))

   CREATE TABLE CardEJBTable (cardno varchar(50) not null, employee    
varchar(50), primary key (cardno), foreign key (employee) references    
EmployeeEJB Table(name) on delete cascade)
   CREATE TRIGGER  card on EmployeeEJBTable for delete as delete    CardEJBTable  
where employee in (select name from deleted)

   CREATE TRIGGER  emp on CardEJBTable for delete as delete EmployeeEJBTable    
where card in (select cardno from deleted)

   insert into EmployeeEJBTable values ('1',1000,'1')
   insert into CardEJBTable values ('1','1')
   DELETE FROM CardEJBTable WHERE cardno = 1

Results in the following error message:

Maximum stored procedure, function, trigger, or view nesting level exceeded  (limit 32).

To work around this issue, do the following:

  1. Run the following script to reset the nested trigger level to 0:

    -- Start batch 
    exec sp_configure 'nested triggers', 0  -- This set's the new value. 
    reconfigure with override -- This makes the change permanent 
    -- End batch 
    
  2. Verify the current value the SQL server by running the following script:

    exec sp_configure 'nested triggers' 
    

Using Triggers and EJBs

Applications using EJBs with a Microsoft driver may encounter situations when the return code from the execute() method is 0, when the expected value is 1 (1 record deleted).

For example:

   CREATE TABLE EmployeeEJBTable (name varchar(50) not null,salary int, card     
varchar(50), primary key (name))

   CREATE TABLE CardEJBTable (cardno varchar(50) not null, employee    
varchar(50), primary key (cardno), foreign key (employee) references    
EmployeeEJB Table(name) on delete cascade)
   CREATE TRIGGER  emp on CardEJBTable for delete as delete EmployeeEJBTable    
where card in (select cardno from deleted)

   insert into EmployeeEJBTable values ('1',1000,'1')
   insert into CardEJBTable values ('1','1')
   DELETE FROM CardEJBTable WHERE cardno = 1
The EJB code assumes that the record is not found and throws an appropriate error 
message. 
To work around this issue, run the following script:
   exec sp_configure 'show advanced options', 1
   reconfigure with override
   exec sp_configure 'disallow results from triggers',1
   reconfigure with override