From cfc88fc49174ac65fea7bce39764478ef5444dc4 Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Tue, 19 Dec 2017 14:10:16 +0200 Subject: [PATCH] Update notes for 2017-12-19 --- content/post/2017-12.md | 113 +++++++++++++++ public/2017-12/index.html | 129 +++++++++++++++++- .../postgres-connections-month-cgspace-2.png | Bin 0 -> 11937 bytes public/robots.txt | 2 +- public/sitemap.xml | 20 +-- .../postgres-connections-month-cgspace-2.png | Bin 0 -> 11937 bytes 6 files changed, 250 insertions(+), 14 deletions(-) create mode 100644 public/2017/12/postgres-connections-month-cgspace-2.png create mode 100644 static/2017/12/postgres-connections-month-cgspace-2.png diff --git a/content/post/2017-12.md b/content/post/2017-12.md index 10eb5d060..56d9ce5d1 100644 --- a/content/post/2017-12.md +++ b/content/post/2017-12.md @@ -417,3 +417,116 @@ $ schedtool -D -e ionice -c2 -n7 nice -n19 dspace index-discovery ``` - I don't have time now to look into this but the Solr sharding has long been an issue! +- Looking into using JDBC / JNDI to provide a database pool to DSpace +- The [DSpace 6.x configuration docs](https://wiki.duraspace.org/display/DSDOC6x/Configuration+Reference) have more notes about setting up the database pool than the 5.x ones (which actually have none!) +- First, I uncomment `db.jndi` in _dspace/config/dspace.cfg_ +- Then I create a global `Resource` in the main Tomcat _server.xml_ (inside `GlobalNamingResources`): + +``` + +``` + +- Most of the parameters are from comments by Mark Wood about his JNDI setup: https://jira.duraspace.org/browse/DS-3564 +- Then I add a `ResourceLink` to each web application context: + +``` + +``` + +- I am not sure why several guides show configuration snippets for _server.xml_ and web application contexts that use a Local and Global jdbc... +- When DSpace can't find the JNDI context (for whatever reason) you will see this in the dspace logs: + +``` +2017-12-19 13:12:08,796 ERROR org.dspace.storage.rdbms.DatabaseManager @ Error retrieving JNDI context: jdbc/dspace +javax.naming.NameNotFoundException: Name [jdbc/dspace] is not bound in this Context. Unable to find [jdbc]. + at org.apache.naming.NamingContext.lookup(NamingContext.java:825) + at org.apache.naming.NamingContext.lookup(NamingContext.java:173) + at org.dspace.storage.rdbms.DatabaseManager.initDataSource(DatabaseManager.java:1414) + at org.dspace.storage.rdbms.DatabaseManager.initialize(DatabaseManager.java:1331) + at org.dspace.storage.rdbms.DatabaseManager.getDataSource(DatabaseManager.java:648) + at org.dspace.storage.rdbms.DatabaseManager.getConnection(DatabaseManager.java:627) + at org.dspace.core.Context.init(Context.java:121) + at org.dspace.core.Context.(Context.java:95) + at org.dspace.app.util.AbstractDSpaceWebapp.register(AbstractDSpaceWebapp.java:79) + at org.dspace.app.util.DSpaceContextListener.contextInitialized(DSpaceContextListener.java:128) + at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5110) + at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) + at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015) + at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991) + at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) + at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712) + at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) + at java.lang.Thread.run(Thread.java:748) +2017-12-19 13:12:08,798 INFO org.dspace.storage.rdbms.DatabaseManager @ Unable to locate JNDI dataSource: jdbc/dspace +2017-12-19 13:12:08,798 INFO org.dspace.storage.rdbms.DatabaseManager @ Falling back to creating own Database pool +``` + +- And indeed the Catalina logs show that it failed to set up the JDBC driver: + +``` +org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.postgresql.Driver' +``` + +- There are several copies of the PostgreSQL driver installed by DSpace: + +``` +$ find ~/dspace/ -iname "postgresql*jdbc*.jar" +/Users/aorth/dspace/webapps/jspui/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar +/Users/aorth/dspace/webapps/oai/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar +/Users/aorth/dspace/webapps/xmlui/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar +/Users/aorth/dspace/webapps/rest/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar +/Users/aorth/dspace/lib/postgresql-9.1-901-1.jdbc4.jar +``` + +- These apparently come from the main DSpace `pom.xml`: + +``` + + postgresql + postgresql + 9.1-901-1.jdbc4 + +``` + +- So WTF? Let's try copying one to Tomcat's lib folder and restarting Tomcat: + +``` +$ cp ~/dspace/lib/postgresql-9.1-901-1.jdbc4.jar /usr/local/opt/tomcat@7/libexec/lib +``` + +- Oh that's fantastic, now at least Tomcat doesn't print an error during startup so I guess it succeeds to create the JNDI pool +- DSpace starts up but I have no idea if it's using the JNDI configuration because I see this in the logs: + +``` +2017-12-19 13:26:54,271 INFO org.dspace.storage.rdbms.DatabaseManager @ DBMS is '{}'PostgreSQL +2017-12-19 13:26:54,277 INFO org.dspace.storage.rdbms.DatabaseManager @ DBMS driver version is '{}'9.5.10 +2017-12-19 13:26:54,293 INFO org.dspace.storage.rdbms.DatabaseUtils @ Loading Flyway DB migrations from: filesystem:/Users/aorth/dspace/etc/postgres, classpath:org.dspace.storage.rdbms.sqlmigration.postgres, classpath:org.dspace.storage.rdbms.migration +2017-12-19 13:26:54,306 INFO org.flywaydb.core.internal.dbsupport.DbSupportFactory @ Database: jdbc:postgresql://localhost:5432/dspacetest (PostgreSQL 9.5) +``` + +- Let's try again, but this time explicitly blank the PostgreSQL connection parameters in dspace.cfg and see if DSpace starts... +- Wow, ok, that works, but having to copy the PostgreSQL JDBC JAR to Tomcat's lib folder totally blows +- Also, it's likely this is only a problem on my local macOS + Tomcat test environment +- Ubuntu's Tomcat distribution will probably handle this differently +- So for reference I have: + - a `` defined globally in server.xml + - a `` defined in each web application's context XML + - unset the `db.url`, `db.username`, and `db.password` parameters in dspace.cfg + - set the `db.jndi` in dspace.cfg to the name specified in the web application context + diff --git a/public/2017-12/index.html b/public/2017-12/index.html index b319daa4d..aac70bf7e 100644 --- a/public/2017-12/index.html +++ b/public/2017-12/index.html @@ -23,7 +23,7 @@ The list of connections to XMLUI and REST API for today: - + @@ -56,9 +56,9 @@ The list of connections to XMLUI and REST API for today: "@type": "BlogPosting", "headline": "December, 2017", "url": "https://alanorth.github.io/cgspace-notes/2017-12/", - "wordCount": "2421", + "wordCount": "2915", "datePublished": "2017-12-01T13:53:54+03:00", - "dateModified": "2017-12-19T10:14:51+02:00", + "dateModified": "2017-12-19T10:38:57+02:00", "author": { "@type": "Person", "name": "Alan Orth" @@ -585,6 +585,129 @@ $ schedtool -D -e ionice -c2 -n7 nice -n19 dspace index-discovery
  • I don’t have time now to look into this but the Solr sharding has long been an issue!
  • +
  • Looking into using JDBC / JNDI to provide a database pool to DSpace
  • +
  • The DSpace 6.x configuration docs have more notes about setting up the database pool than the 5.x ones (which actually have none!)
  • +
  • First, I uncomment db.jndi in dspace/config/dspace.cfg
  • +
  • Then I create a global Resource in the main Tomcat server.xml (inside GlobalNamingResources):
  • +
+ +
	<Resource name="jdbc/dspace" auth="Container" type="javax.sql.DataSource"
+		  driverClassName="org.postgresql.Driver"
+		  url="jdbc:postgresql://localhost:5432/dspace"
+		  username="dspace"
+		  password="dspace"
+          initialSize='5'
+          maxActive='50'
+          maxIdle='15'
+          minIdle='5'
+          maxWait='5000'
+          validationQuery='SELECT 1'
+          testOnBorrow='true' />
+
+ + + +
<ResourceLink global="jdbc/dspace" name="jdbc/dspace" type="javax.sql.DataSource"/>
+
+ +
    +
  • I am not sure why several guides show configuration snippets for server.xml and web application contexts that use a Local and Global jdbc…
  • +
  • When DSpace can’t find the JNDI context (for whatever reason) you will see this in the dspace logs:
  • +
+ +
2017-12-19 13:12:08,796 ERROR org.dspace.storage.rdbms.DatabaseManager @ Error retrieving JNDI context: jdbc/dspace
+javax.naming.NameNotFoundException: Name [jdbc/dspace] is not bound in this Context. Unable to find [jdbc].
+        at org.apache.naming.NamingContext.lookup(NamingContext.java:825)
+        at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
+        at org.dspace.storage.rdbms.DatabaseManager.initDataSource(DatabaseManager.java:1414)
+        at org.dspace.storage.rdbms.DatabaseManager.initialize(DatabaseManager.java:1331)
+        at org.dspace.storage.rdbms.DatabaseManager.getDataSource(DatabaseManager.java:648)
+        at org.dspace.storage.rdbms.DatabaseManager.getConnection(DatabaseManager.java:627)
+        at org.dspace.core.Context.init(Context.java:121)
+        at org.dspace.core.Context.<init>(Context.java:95)
+        at org.dspace.app.util.AbstractDSpaceWebapp.register(AbstractDSpaceWebapp.java:79)
+        at org.dspace.app.util.DSpaceContextListener.contextInitialized(DSpaceContextListener.java:128)
+        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5110)
+        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633)
+        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
+        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015)
+        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991)
+        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
+        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712)
+        at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002)
+        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
+        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
+        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+        at java.lang.Thread.run(Thread.java:748)
+2017-12-19 13:12:08,798 INFO  org.dspace.storage.rdbms.DatabaseManager @ Unable to locate JNDI dataSource: jdbc/dspace
+2017-12-19 13:12:08,798 INFO  org.dspace.storage.rdbms.DatabaseManager @ Falling back to creating own Database pool
+
+ +
    +
  • And indeed the Catalina logs show that it failed to set up the JDBC driver:
  • +
+ +
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.postgresql.Driver'
+
+ +
    +
  • There are several copies of the PostgreSQL driver installed by DSpace:
  • +
+ +
$ find ~/dspace/ -iname "postgresql*jdbc*.jar"
+/Users/aorth/dspace/webapps/jspui/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar
+/Users/aorth/dspace/webapps/oai/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar
+/Users/aorth/dspace/webapps/xmlui/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar
+/Users/aorth/dspace/webapps/rest/WEB-INF/lib/postgresql-9.1-901-1.jdbc4.jar
+/Users/aorth/dspace/lib/postgresql-9.1-901-1.jdbc4.jar
+
+ +
    +
  • These apparently come from the main DSpace pom.xml:
  • +
+ +
<dependency>
+   <groupId>postgresql</groupId>
+   <artifactId>postgresql</artifactId>
+   <version>9.1-901-1.jdbc4</version>
+</dependency>
+
+ +
    +
  • So WTF? Let’s try copying one to Tomcat’s lib folder and restarting Tomcat:
  • +
+ +
$ cp ~/dspace/lib/postgresql-9.1-901-1.jdbc4.jar /usr/local/opt/tomcat@7/libexec/lib
+
+ +
    +
  • Oh that’s fantastic, now at least Tomcat doesn’t print an error during startup so I guess it succeeds to create the JNDI pool
  • +
  • DSpace starts up but I have no idea if it’s using the JNDI configuration because I see this in the logs:
  • +
+ +
2017-12-19 13:26:54,271 INFO  org.dspace.storage.rdbms.DatabaseManager @ DBMS is '{}'PostgreSQL
+2017-12-19 13:26:54,277 INFO  org.dspace.storage.rdbms.DatabaseManager @ DBMS driver version is '{}'9.5.10
+2017-12-19 13:26:54,293 INFO  org.dspace.storage.rdbms.DatabaseUtils @ Loading Flyway DB migrations from: filesystem:/Users/aorth/dspace/etc/postgres, classpath:org.dspace.storage.rdbms.sqlmigration.postgres, classpath:org.dspace.storage.rdbms.migration
+2017-12-19 13:26:54,306 INFO  org.flywaydb.core.internal.dbsupport.DbSupportFactory @ Database: jdbc:postgresql://localhost:5432/dspacetest (PostgreSQL 9.5)
+
+ +
    +
  • Let’s try again, but this time explicitly blank the PostgreSQL connection parameters in dspace.cfg and see if DSpace starts…
  • +
  • Wow, ok, that works, but having to copy the PostgreSQL JDBC JAR to Tomcat’s lib folder totally blows
  • +
  • Also, it’s likely this is only a problem on my local macOS + Tomcat test environment
  • +
  • Ubuntu’s Tomcat distribution will probably handle this differently
  • +
  • So for reference I have: + +
      +
    • a <Resource> defined globally in server.xml
    • +
    • a <ResourceLink> defined in each web application’s context XML
    • +
    • unset the db.url, db.username, and db.password parameters in dspace.cfg
    • +
    • set the db.jndi in dspace.cfg to the name specified in the web application context
    • +
diff --git a/public/2017/12/postgres-connections-month-cgspace-2.png b/public/2017/12/postgres-connections-month-cgspace-2.png new file mode 100644 index 0000000000000000000000000000000000000000..11731d5047cb4e35389cc496a2f73eb806ac3b53 GIT binary patch literal 11937 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 KB+JDOfBYX{bZyrF literal 0 HcmV?d00001 diff --git a/public/robots.txt b/public/robots.txt index d2ae9994d..7c86be3fe 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -30,7 +30,7 @@ Disallow: /cgspace-notes/2015-12/ Disallow: /cgspace-notes/2015-11/ Disallow: /cgspace-notes/ Disallow: /cgspace-notes/categories/ -Disallow: /cgspace-notes/tags/notes/ Disallow: /cgspace-notes/categories/notes/ +Disallow: /cgspace-notes/tags/notes/ Disallow: /cgspace-notes/post/ Disallow: /cgspace-notes/tags/ diff --git a/public/sitemap.xml b/public/sitemap.xml index 9500729d1..163c01278 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -4,7 +4,7 @@ https://alanorth.github.io/cgspace-notes/2017-12/ - 2017-12-19T10:14:51+02:00 + 2017-12-19T10:38:57+02:00 @@ -139,7 +139,7 @@ https://alanorth.github.io/cgspace-notes/ - 2017-12-19T10:14:51+02:00 + 2017-12-19T10:38:57+02:00 0 @@ -148,27 +148,27 @@ 0 - - https://alanorth.github.io/cgspace-notes/tags/notes/ - 2017-12-19T10:14:51+02:00 - 0 - - https://alanorth.github.io/cgspace-notes/categories/notes/ 2017-09-28T12:00:49+03:00 0 + + https://alanorth.github.io/cgspace-notes/tags/notes/ + 2017-12-19T10:38:57+02:00 + 0 + + https://alanorth.github.io/cgspace-notes/post/ - 2017-12-19T10:14:51+02:00 + 2017-12-19T10:38:57+02:00 0 https://alanorth.github.io/cgspace-notes/tags/ - 2017-12-19T10:14:51+02:00 + 2017-12-19T10:38:57+02:00 0 diff --git a/static/2017/12/postgres-connections-month-cgspace-2.png b/static/2017/12/postgres-connections-month-cgspace-2.png new file mode 100644 index 0000000000000000000000000000000000000000..11731d5047cb4e35389cc496a2f73eb806ac3b53 GIT binary patch literal 11937 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 KB+JDOfBYX{bZyrF literal 0 HcmV?d00001