Wednesday, August 15, 2007

Oracle 11G first look

Oracle 11g is now available for download, but only for Linux. This blog posting covers practical issues we've seen since we started playing with it. If you are looking for marketing/new feature info you can find the PDF's here.





    Installation




      1. Download is a 1.8GB zip file.
      2. The Installer requires a minimum of 922MB of memory and large quantities of swap space. If you need more swap you can use 'swapadd'.
      3. Installer for X86 expects recent patches - don't think that your copy of RHEL4 will work without new rpm's.
      4. Oracle has changed the default location of the *dump and other configuration directories.
      5. Some minor Kernel tweaks required.




        DB Upgrade Process





          Process expects that your copy of 10.2.0 is patched to 10.2.0.3.0 to address a DST issue. If not you have to manually apply Oracle patches and jump through various other hoops. We encountered problems with the upgrade and eventually built an11g DB from scratch for our regression testing. This may a fundamental problem with the upgrade but is more likely to be because 'someone' unplugged our router during the upgrade process and left the DB in a mess.





            Security

              Passwords are now case sensitive. This will cause hours of fun.


                11g JDBC Driver



                  1. 1.4 and earlier versions of Java are not supported.
                  2. 9.0.1 and prior versions of Oracle are not supported.
                  3. 'oracle.jdbc.driver' is gone - but then it's been deprecated since 9i...
                  4. We were expecting OracleConnection to be extended to prrovide support for Asynchronous Commit, but that didn't happen. We'll be adding our own support to OrindaBuild.




                    JPublisher


                      The 11g version of JPublisher still creates .sqlj files but then deletes them after producing .java files. JPublisher still has all its other limitations.



                        OrindaBuild 11g Support



                          We have completed regression testing and the first build that supports 11g is available here. JDeveloper users can use this update center:

                            http://www.orindasoft.com/public/jdev103Center.xml

                              SQLDeveloper users can use this update center:

                                http://www.orindasoft.com/public/sqldevCenter.xml

                                  Labels: , , , , ,

                                  Sunday, July 1, 2007

                                  Not All Jdbc Advice Is Good JDBC Advice...

                                  While wandering around the web I stumbled across a link to a sample chapter for 'Java Programming with Oracle JDBC', published in December 2001 by O'Reilly. Now 2001 is a bit dated but one would assume that if they are plugging it on their web site it must still be relevent. And that any glaring

                                  errors would have been corrected, right? Think again...

                                  The author spends the chapter conducting elaborate benchmarks which in his view demonstrate that there's nothing special about PreparedStatement
                                  and that you should really be using Statement most of the time. His reasoning is based on the premise that the additional set up costs of Prepareing a statement and sending all the bind variables etc cause applications to run more slowly than if you had simply said something like:

                                  code>


                                  Statement stmt = conn.createStatement();

                                  stmt.executeUpdate(

                                  "insert into oehr.testxxxperf ( id, code, descr,insert_user, insert_date ) "

                                  "values ( " + Integer.toString( i ) + ", '125678901234567890', "

                                  "'1234567890', " +




                                  "USER, to_date('" + sdf.format(new java.util.Date(System.currentTimeMillis()))
                                  + "', 'YYYYMMDDHH24MISS'))");

                                  instead of:

                                  PreparedStatement stmt = conn.prepareStatement(

                                  "insert into oehr.testxxxperf ( id, code, descr,insert_user,

                                  insert_date ) " +

                                  "values ( ?, ?, ?, ?, ? )");

                                  startTime = System.currentTimeMillis();

                                  int i=1;

                                  stmt.setInt(1,i);

                                  stmt.setString(2,"123456789012345678901234567890");

                                  stmt.setString(3,"123456789019012345678901234567890");

                                  stmt.setString(4,"ZXVI01");

                                  stmt.setDate(5,newjava.sql.Date(System.currentTimeMillis()));

                                  stmt.executeUpdate();




                                  The point made is that unless you plan on issuing hundreds of statements the first method is faster because it has fewer network round trips and therefore less elapsed time. All of which is true - provided there is only 1 copy of the client software being used. In practice what will happen is that using Statement in preference to PreparedStatement will cause the database server to devote significant resources to compiling execution plans for each and every version of the insert statement being called. Indeed, not using PreparedStatement and bind variables is listed as the second most common mistake in Oracle's '
                                  Top Ten Mistakes Found in Oracle Systems'.There's also a less obvious but equally serious problem with cobbling together your SQL statements instead of using bind variables and PreparedStatement - sooner or later someone with an apostrophe in their name will show up and cause a syntax error:



                                  Int empno = 42;

                                  String empname = "O'Reilly";

                                  String myStatement = "INSERT INTO EMP (empno, ename) VALUES ("

                                  + empno + ",'" + empname + "');";




                                  But wait... it gets worse! If you're working on a public facing web system and some bright spark realizes you are hacking together SQL statements you could have something like this happen:



                                  Int empno = 42;

                                  String ename = "'Smith', sal = 99999";

                                  String myStatement = "UPDATE EMP set ename = "

                                  + ename+ " WHERE empno = " + empno');";


                                  which means that your Statement would be:


                                  UPDATE EMP set ename = 'Smith', sal = 99999 WHERE empno = 42;

                                  [This post originally appeared on JRoller]

                                  Labels: , ,

                                  Wednesday, June 6, 2007

                                  Why '43113f...0308' is bad news for Java users...

                                  While going through our web server logs recently we found out that we had our first single word google hit. Unfortunately the word in question is 43113f32554e54494d45110e4350500308,
                                  which we suspect isn't terribly memorable. It's thrown as an error id when the JVM crashes and is referred to in the support section of our web site.

                                  We've now had hundreds of people show up at our web site trying to find out about this. We suspect we may see many more, as the underlying problem appears to affect all applications that use the Java 1.3 or 1.4 JVMs.

                                  If you encounter this you will find the following information useful:

                                    • This is Sun bug 4820592.
                                    • The bug appears to be limited to x86 based systems.
                                    • The bug will appear as a JVM crash after the application has done a fair amount of work.
                                    • If you try and use the 'debug' mode of an IDE such as Eclipse the JVM crash will take place at odd and changing locations.
                                    • Using interpreted mode ('-Xint') is an effective workaround.
                                    • Changing other JVM parameters may postpone the crash but will not prevent it.
                                    • To prevent it you can:
                                      • Move to Java 1.5
                                      • Rewrite your code.
                                  In our case we were able to fix the problem by replacing an ArrayList of String[] with an ArrayList of File, with each File containing 0 or more String. We suspect that the presence of zero length 'String[]'s in the arraylist was the root cause of the problem.

                                  [This post originally appeared on JRoller]

                                  Labels: