| 1 | [[PageOutline]]
|
|---|
| 2 |
|
|---|
| 3 | = SQLite JDBC Driver =
|
|---|
| 4 |
|
|---|
| 5 | SQLite JDBC driver, which is developed by [wiki:leo Taro L. Saito], is an extension of [http://www.zentus.com/sqlitejdbc Zentus's SQLite JDBC driver] that enables you to access [http://sqlite.org SQLite] database files in Java codes.
|
|---|
| 6 |
|
|---|
| 7 | Our SQLiteJDBC library, which is developed as a part of [http://www.xerial.org Xerial project], requires no configuration, since all native libraries for Windows, Mac OS X, Linux, Soralis, etc. and the pure-java SQLite, which works in any enviroment, are assembled into a single JAR (Java Archive) file. Usage is quite simple; [#Download Download] our sqlite-jdbc library, then append the jar file to your class path.
|
|---|
| 8 |
|
|---|
| 9 | == What is different from Zentus's SQLite JDBC? ==
|
|---|
| 10 |
|
|---|
| 11 | The original Zentus's SQLite JDBC driver http://www.zentus.com/sqlitejdbc/ itself is an excellent utility for using [http://sqlite.org SQLite] databases from Java language, and our SQLiteJDBC library also relies on its implementation. However, SQLite JDBC driver's pure-java version, which totally translates c/c++ codes of SQLite into Java, is significantly slower than its native version, which uses SQLite native binaries compiled for each OS (win, mac, linux).
|
|---|
| 12 |
|
|---|
| 13 | On the other hand, in order to use the native version, user has to set a path to the native codes (dll, jnilib, so files, which are JNDI C programs) by using command-line arguments, e.g., -Djava.library.path=(path to the dll, jnilib, etc.), or -Dorg.sqlite.lib.path, etc. This process is error-prone, and bothersome to tell every user to set these variables. Our SQLiteJDBC library completely does away these inconveniences.
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 | == Public Discussion Forum ==
|
|---|
| 17 | * Post bug reports or feature requests to [http://groups.google.com/group/xerial Xerial Public Discussion Group]
|
|---|
| 18 |
|
|---|
| 19 | == News ==
|
|---|
| 20 | * 2008 October 14th: sqlite-jdbc-3.6.3 released. Compatible with SQLite 3.6.3.
|
|---|
| 21 | * 2008 September 18th: sqlite-jdbc-3.6.2 released. Compatible with SQLite 3.6.2 and contains pure-java and native versions.
|
|---|
| 22 | * 2008 July 17th: sqlite-jdbc-3.6.0 released. Compatible with SQLite 3.6.0, and includes both pure-java and native versions.
|
|---|
| 23 | * 2008 July 3rd: [http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/3.5.9-universal sqlite-jdbc-3.5.9-universal] released. This version contains both native and pure-java SQLite libraries, so it probably works in any OS environment.
|
|---|
| 24 |
|
|---|
| 25 | * 2008 May 29th: Current development revision (sqlite-jdbc-3.5.9-1) can be compiled with JDK 6. No need to use JDK 1.5 for compiling SQLiteJDBC.
|
|---|
| 26 | * 2008 May 20th: sqlite-jdbc-3.5.9 released.
|
|---|
| 27 | * 2008 May 20th: sqlite-jdbc-3.5.8 released (corresponding to SQLite 3.5.8 and sqlite-jdbc-v047). From this release, Windows, Mac OS X, Linux (i386, amd64) and Solaris (SunOS, sparcv9) libraries are bundled into one jar file.
|
|---|
| 28 | * 2008 May 1st: sqlite-jdbc is now in the maven central repository! [#UsingSQLiteJDBCwithMaven2 How to use SQLiteJDBC with Maven2]
|
|---|
| 29 | * 2008 Mar. 18th: sqlite-jdbc-3.5.7 released. This version corresponds to [http://www.sqlite.org/releaselog/3_5_7.html SQLite 3.5.7].
|
|---|
| 30 |
|
|---|
| 31 | * 2008 Mar. 10th: sqlite-jdbc-v042 released. Corresponding to SQLite 3.5.6, which integrates FTS3 (full text search).
|
|---|
| 32 | * 2008 Jan. 31st: sqlite-jdbc-v038.4 released. SQLiteJDBCLoder.initialize() is no longer requried.
|
|---|
| 33 | * 2008 Jan. 11th: The Jar files for Windows, Mac OS X and Linux are packed into a single Jar file! So, no longer need to use an OS-specific jar file.
|
|---|
| 34 | * 2007 Dec. 31th: Upgraded to sqlitejdbc-v038
|
|---|
| 35 |
|
|---|
| 36 | == Download ==
|
|---|
| 37 | Download the latest version of SQLiteJDBC from [http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc here].
|
|---|
| 38 | * version 3.6.3 is the latest one.
|
|---|
| 39 | * Do not use sqlite-jdbc-v0xx.jar, which are obsolete libraries but left here for users still using these versions.
|
|---|
| 40 |
|
|---|
| 41 | If your are an [http://maven.apache.org Maven] user, follow the instruction described [#UsingSQLiteJDBCwithMaven2 here].
|
|---|
| 42 |
|
|---|
| 43 | == Supported Operating Systems ==
|
|---|
| 44 | Since the sqlite-jdbc-3.5.9-universal, any OSs that can run Java programs are supported. The natively compiled SQLite engines will be used in the following operating systems:
|
|---|
| 45 |
|
|---|
| 46 | * Windows XP, Vista (Windows, x86 architecture)
|
|---|
| 47 | * Mac OS X 10.4 (Tiger), 10.5(Leopard) (for i386, Intel CPU machines)
|
|---|
| 48 | * Linux i386 (Intel), amd64 (64-bit X86 Intel processor)
|
|---|
| 49 |
|
|---|
| 50 | In the other OSs not listed above, the pure-java SQLite is used.
|
|---|
| 51 |
|
|---|
| 52 | If you want to use the native library for your OS, [#BuildfromSource build the source from scratch].
|
|---|
| 53 |
|
|---|
| 54 |
|
|---|
| 55 | == Usage ==
|
|---|
| 56 |
|
|---|
| 57 | 1. Download sqlite-jdbc-(VERSION).jar from [http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/], then append this jar file into your classpath.
|
|---|
| 58 | 1. load the JDBC driver org.sqlite.JDBC from your code. (see the example below)
|
|---|
| 59 |
|
|---|
| 60 | * Usage Example (Assuming sqlite-jdbc-(VERSION).jar is placed in the current directory)
|
|---|
| 61 | {{{
|
|---|
| 62 | > javac Sample.java
|
|---|
| 63 | > java -classpath ".:sqlite-jdbc-(VERSION).jar" Sample
|
|---|
| 64 | name = leo
|
|---|
| 65 | id = 1
|
|---|
| 66 | name = yui
|
|---|
| 67 | id = 2
|
|---|
| 68 | }}}
|
|---|
| 69 | * Sample.java
|
|---|
| 70 | {{{
|
|---|
| 71 | #!java
|
|---|
| 72 | import java.sql.Connection;
|
|---|
| 73 | import java.sql.DriverManager;
|
|---|
| 74 | import java.sql.ResultSet;
|
|---|
| 75 | import java.sql.SQLException;
|
|---|
| 76 | import java.sql.Statement;
|
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 | public class Sample
|
|---|
| 80 | {
|
|---|
| 81 | public static void main(String[] args) throws ClassNotFoundException
|
|---|
| 82 | {
|
|---|
| 83 | // load the sqlite-JDBC driver using the current class loader
|
|---|
| 84 | Class.forName("org.sqlite.JDBC");
|
|---|
| 85 |
|
|---|
| 86 | Connection connection = null;
|
|---|
| 87 | try
|
|---|
| 88 | {
|
|---|
| 89 | // create a database connection
|
|---|
| 90 | connection = DriverManager.getConnection("jdbc:sqlite:sample.db");
|
|---|
| 91 | Statement statement = connection.createStatement();
|
|---|
| 92 | statement.setQueryTimeout(30); // set timeout to 30 sec.
|
|---|
| 93 |
|
|---|
| 94 | statement.executeUpdate("drop table if exists person");
|
|---|
| 95 | statement.executeUpdate("create table person (id integer, name string)");
|
|---|
| 96 | statement.executeUpdate("insert into person values(1, 'leo')");
|
|---|
| 97 | statement.executeUpdate("insert into person values(2, 'yui')");
|
|---|
| 98 | ResultSet rs = statement.executeQuery("select * from person");
|
|---|
| 99 | while(rs.next())
|
|---|
| 100 | {
|
|---|
| 101 | // read the result set
|
|---|
| 102 | System.out.println("name = " + rs.getString("name"));
|
|---|
| 103 | System.out.println("id = " + rs.getInt("id"));
|
|---|
| 104 | }
|
|---|
| 105 | }
|
|---|
| 106 | catch(SQLException e)
|
|---|
| 107 | {
|
|---|
| 108 | // if the error message is "out of memory",
|
|---|
| 109 | // it probably means no database file is found
|
|---|
| 110 | System.err.println(e.getMessage());
|
|---|
| 111 | }
|
|---|
| 112 | finally
|
|---|
| 113 | {
|
|---|
| 114 | try
|
|---|
| 115 | {
|
|---|
| 116 | if(connection != null)
|
|---|
| 117 | connection.close();
|
|---|
| 118 | }
|
|---|
| 119 | catch(SQLException e)
|
|---|
| 120 | {
|
|---|
| 121 | // connection close failed.
|
|---|
| 122 | System.err.println(e);
|
|---|
| 123 | }
|
|---|
| 124 | }
|
|---|
| 125 | }
|
|---|
| 126 | }
|
|---|
| 127 | }}}
|
|---|
| 128 |
|
|---|
| 129 | The usage of SQLite-JDBC driver is the same with the original version. See http://www.zentus.com/sqlitejdbc/ for the general usage. For usage of JDBC, see [http://www.xerial.org/trac/Xerial/wiki/WebApplication/JDBC my article] about JDBC.
|
|---|
| 130 |
|
|---|
| 131 | == How to Specify Database Files ==
|
|---|
| 132 | Here is an example to select a file C:\work\mydatabase.db (in Windows)
|
|---|
| 133 | {{{
|
|---|
| 134 | #!java
|
|---|
| 135 | Connection connection = DriverManager.getConnection("jdbc:sqlite:C:/work/mydatabase.db");
|
|---|
| 136 | }}}
|
|---|
| 137 |
|
|---|
| 138 | A UNIX (Linux, Mac OS X, etc) file /home/leo/work/mydatabase.db
|
|---|
| 139 | {{{
|
|---|
| 140 | #!java
|
|---|
| 141 | Connection connection = DriverManager.getConnection("jdbc:sqlite:/home/leo/work/mydatabase.db");
|
|---|
| 142 | }}}
|
|---|
| 143 |
|
|---|
| 144 | == How to Use Memory Databases ==
|
|---|
| 145 | SQLite supports on-memory database management, which does not create any database files. To use a memory database in your Java code, get the database connection as follows:
|
|---|
| 146 | {{{
|
|---|
| 147 | #!java
|
|---|
| 148 | Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");
|
|---|
| 149 | }}}
|
|---|
| 150 |
|
|---|
| 151 | == How to test the running mode: Native or Pure-Java Version? ==
|
|---|
| 152 | {{{
|
|---|
| 153 | #!java
|
|---|
| 154 | import org.xerial.db.sql.sqlite.SQLiteJDBCLoader;
|
|---|
| 155 |
|
|---|
| 156 | // in your function ...
|
|---|
| 157 | void test()
|
|---|
| 158 | {
|
|---|
| 159 | System.out.println(String.format("running in %s mode", SQLiteJDBCLoader.isNativeMode() ? "native" : "pure-java"));
|
|---|
| 160 | }
|
|---|
| 161 |
|
|---|
| 162 |
|
|---|
| 163 | }}}
|
|---|
| 164 |
|
|---|
| 165 | == Run in Pure-Java mode ==
|
|---|
| 166 |
|
|---|
| 167 | In some OS (e.g., old Linux kernel), loading native library causes JVM crashes. In this case, set sqlite.purejava=true JVM variable:
|
|---|
| 168 | {{{
|
|---|
| 169 | > java -Dsqlite.purejava=true -cp .:sqlite-jdbc-3.6.3.jar Sample
|
|---|
| 170 | }}}
|
|---|
| 171 |
|
|---|
| 172 | Or, set this System property before loading the JDBC driver:
|
|---|
| 173 | {{{
|
|---|
| 174 | System.setProperty("sqlite.purejava", "true");
|
|---|
| 175 | Class.forName("org.sqlite.JDBC");
|
|---|
| 176 | }}}
|
|---|
| 177 |
|
|---|
| 178 | In this mode, sqlite-jdbc never uses native SQLite libraries.
|
|---|
| 179 |
|
|---|
| 180 | == How does SQLiteJDBC work? ==
|
|---|
| 181 |
|
|---|
| 182 | Our SQLite JDBC driver package (i.e., sqlite-jdbc-(VERSION).jar) contains three types of native SQLite libraries (sqlite-jdbc.dll, sqlite-jdbc.jnilib, sqlite-jdbc.so), each of them is compiled for Windows, Mac OS and Linux. An appropriate native library file is automatically extracted into your OS's temporary folder, when your program loads "org.sqlite.JDBC" driver.
|
|---|
| 183 |
|
|---|
| 184 | == Source Codes ==
|
|---|
| 185 | * Subversion Repository: http://www.xerial.org/svn/project/XerialJ/trunk/sqlite-jdbc/
|
|---|
| 186 | * version 3.6.3 snapshot: http://www.xerial.org/svn/project/XerialJ/tags/sqlite-jdbc/sqlite-jdbc-3.6.3
|
|---|
| 187 |
|
|---|
| 188 | web viewer: http://www.xerial.org/trac/Xerial/browser/XerialJ/trunk/sqlite-jdbc
|
|---|
| 189 |
|
|---|
| 190 | == License ==
|
|---|
| 191 |
|
|---|
| 192 | This program follows the Apache License version 2.0 (http://www.apache.org/licenses/ )
|
|---|
| 193 | That means:
|
|---|
| 194 |
|
|---|
| 195 | It allows you to:
|
|---|
| 196 | * freely download and use this software, in whole or in part, for personal, company internal, or commercial purposes;
|
|---|
| 197 | * use this software in packages or distributions that you create.
|
|---|
| 198 |
|
|---|
| 199 | It forbids you to:
|
|---|
| 200 | * redistribute any piece of our originated software without proper attribution;
|
|---|
| 201 | * use any marks owned by us in any way that might state or imply that we xerial.org endorse your distribution;
|
|---|
| 202 | * use any marks owned by us in any way that might state or imply that you created this software in question.
|
|---|
| 203 |
|
|---|
| 204 | It requires you to:
|
|---|
| 205 | * include a copy of the license in any redistribution you may make that includes this software;
|
|---|
| 206 | * provide clear attribution to us, xerial.org for any distributions that include this software
|
|---|
| 207 |
|
|---|
| 208 | It does not require you to:
|
|---|
| 209 | * include the source of this software itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it;
|
|---|
| 210 | * submit changes that you make to the software back to this software (though such feedback is encouraged).
|
|---|
| 211 |
|
|---|
| 212 | See License FAQ http://www.apache.org/foundation/licence-FAQ.html for more details.
|
|---|
| 213 |
|
|---|
| 214 | == Using SQLiteJDBC with Maven2 ==
|
|---|
| 215 | If you are familier with [http://maven.apache.org Maven2], add the following XML fragments into your pom.xml file. With those settings, your Maven will automatically download our SQLiteJDBC library into your local Maven repository, since our sqlite-jdbc libraries are synchronized with the [http://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/ Maven's central repository].
|
|---|
| 216 |
|
|---|
| 217 | {{{
|
|---|
| 218 | #!xml
|
|---|
| 219 | <dependencies>
|
|---|
| 220 | <dependency>
|
|---|
| 221 | <groupId>org.xerial</groupId>
|
|---|
| 222 | <artifactId>sqlite-jdbc</artifactId>
|
|---|
| 223 | <version>3.6.3</version>
|
|---|
| 224 | </dependency>
|
|---|
| 225 | </dependencies>
|
|---|
| 226 | }}}
|
|---|
| 227 |
|
|---|
| 228 | == Using SQLiteJDBC with Tomcat6 Web Server ==
|
|---|
| 229 | Do not include sqlite-jdbc-(version).jar in WEB-INF/lib folder of your web application package, since multiple web applications hosted by the same Tomcat server cannot load the sqlite-jdbc native library more than once. That is the specification of JNI (Java Native Interface). You will observe UnsatisfiedLinkError exception with the message "no SQLite library found".
|
|---|
| 230 |
|
|---|
| 231 | Work-around of this problem is to put sqlite-jdbc-(version).jar file into (TOMCAT_HOME)/lib direcotry, in which multiple web applications can share the same native library file (.dll, .jnilib, .so) extracted from this sqlite-jdbc jar file.
|
|---|
| 232 |
|
|---|
| 233 | If you are using Maven for your web application, set the dependency scope as 'provided', and manually put the SQLite JDBC jar file into (TOMCAT_HOME)/lib folder.
|
|---|
| 234 | {{{
|
|---|
| 235 | <dependency>
|
|---|
| 236 | <groupId>org.xerial</groupId>
|
|---|
| 237 | <artifactId>sqlite-jdbc</artifactId>
|
|---|
| 238 | <version>3.6.3</version>
|
|---|
| 239 | <scope>provided</scope>
|
|---|
| 240 | </dependency>
|
|---|
| 241 | }}}
|
|---|
| 242 |
|
|---|
| 243 | == Build from Source ==
|
|---|
| 244 |
|
|---|
| 245 | If your OS is not supported, consider to build the [#SourceCodes source] from scratch.
|
|---|
| 246 |
|
|---|
| 247 | * Install Java SDK (1.5 or higher) http://java.sun.com
|
|---|
| 248 | * Install [wiki:Subversion Subversion]
|
|---|
| 249 | * Install Maven2 (2.0.7 or higher) http://maven.apache.org
|
|---|
| 250 | * You need to set PATH variable so as to run mvn command. Here is an example setting for maven:
|
|---|
| 251 | {{{
|
|---|
| 252 | export MAVEN_HOME=$HOME/local/maven-2.0.7
|
|---|
| 253 | export PATH=$MAVEN_HOME/bin:$PATH
|
|---|
| 254 | }}}
|
|---|
| 255 | * Checkout the subversion repository
|
|---|
| 256 | {{{
|
|---|
| 257 | svn checkout http://www.xerial.org/svn/project/XerialJ/trunk/sqlite-jdbc sqlite-jdbc
|
|---|
| 258 | }}}
|
|---|
| 259 | * (If necessary) set the JAVA_HOME environment variable as your JDK folder (e.g. /usr/java/jdk1.5.0_13), and PATH so that you can run the javac command.
|
|---|
| 260 | {{{
|
|---|
| 261 | > export JAVA_HOME=/usr/java/jdk1.5.0_13/; export PATH=$JAVA_HOME/bin:$PATH
|
|---|
| 262 | > javac -version
|
|---|
| 263 | javac 1.5.0_13
|
|---|
| 264 | }}}
|
|---|
| 265 | * Type make in the sqlite-jdbc folder:
|
|---|
| 266 | {{{
|
|---|
| 267 | > make
|
|---|
| 268 | }}}
|
|---|
| 269 | * An SQLite JDBC JAR file that can additionally support your OS is generated in target/sqlite-jdbc-(version).jar
|
|---|
| 270 |
|
|---|
| 271 | === Dependency Tests ===
|
|---|
| 272 | * Windows XP (32-bit)
|
|---|
| 273 | * dependency check
|
|---|
| 274 | {{{
|
|---|
| 275 | > DUMPBIN /DEPENDENTS sqlitejdbc.dll
|
|---|
| 276 |
|
|---|
| 277 | KERNEL32.dll
|
|---|
| 278 | msvcrt.dll
|
|---|
| 279 | }}}
|
|---|
| 280 | * Mac OS X (10.4.10 Tiger ~ 10.5 Leopard)
|
|---|
| 281 | * dependency check
|
|---|
| 282 | {{{
|
|---|
| 283 | > otool -L libsqlitejdbc.jnilib
|
|---|
| 284 | libsqlitejdbc.jnilib:
|
|---|
| 285 | build/Darwin-i386/libsqlitejdbc.jnilib (compatibility version 0.0.0, current version 0.0.0)
|
|---|
| 286 | /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.9)
|
|---|
| 287 | }}}
|
|---|
| 288 | * Linux (glibc-2.5.12)
|
|---|
| 289 | * Dependency check
|
|---|
| 290 | {{{
|
|---|
| 291 | > ldd libsqlitejdbc.so
|
|---|
| 292 | linux-gate.so.1 => (0x00b45000)
|
|---|
| 293 | libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x002dd000)
|
|---|
| 294 | /lib/ld-linux.so.2 (0x47969000)
|
|---|
| 295 | }}}
|
|---|
| 296 |
|
|---|