Wiki source code of Building Concurrent Applications with WebObjects and Scala
Version 73.1 by Ravi Mendis on 2010/03/07 16:42
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
| |
73.1 | 1 | Given that todays processors ship with dual or quad cores and server processors ship with between 8 to 32 cores, programs developed in languages like Java, Ruby, Groovy, Python and Perl are struggling to make use of all these cores. Scala, as its name suggests is built from the ground-up for [[concurrent programming>>http://en.wikipedia.org/wiki/Concurrent_computing]] - a methodology that can take advantage of these modern multi-core processors. |
| |
50.1 | 2 | |
| 3 | If you use Scala for a concurrent programming application, the chances are that you're using Scala [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] to do that. | ||
| 4 | |||
| 5 | {{info title="Scala Actors"}} | ||
| 6 | |||
| 7 | Concurrent programming in Scala is based on *Actors* (with an inbox) - a simple metaphor that is analogous to *Message Queues*. | ||
| 8 | |||
| 9 | {{/info}} | ||
| 10 | |||
| 11 | == Using Scala Actors with EOF == | ||
| 12 | |||
| 13 | EOF being notoriously single-threaded, is incredibly unsuitable for use with Scala Actors: | ||
| 14 | |||
| |
73.1 | 15 | * EOs are mutable objects and as such they cannot be passed safely into Scala Actors |
| |
50.1 | 16 | * Fetching and updating EOs from within Scala Actors can cause [[deadlocks>>http://en.wikipedia.org/wiki/Deadlock]] with the WebObjects application |
| 17 | |||
| 18 | Instead you can still use EOF but in a limited fashion - only to execute SQL. | ||
| 19 | |||
| |
73.1 | 20 | === Using EOAccess to execute SQL === |
| |
50.1 | 21 | |
| 22 | Use Wonder API: [[ERXEOAccessUtilities.evaluateSQLWithEntityNamed()>>http://webobjects.mdimension.com/hudson/job/Wonder53/javadoc/er/extensions/eof/ERXEOAccessUtilities.html#evaluateSQLWithEntity(com.webobjects.eocontrol.EOEditingContext,%20com.webobjects.eoaccess.EOEntity,%20java.lang.String)]] | ||
| 23 | |||
| |
73.1 | 24 | ==== Caveats ==== |
| |
50.1 | 25 | |
| 26 | If you're updating the state of EOs directly in the database using SQL from Scala Actors, you will subsequently need to refresh/refetch these EOs for the WebObjects application to see those changes. | ||
| 27 | |||
| |
73.1 | 28 | == EOF Alternatives == |
| |
50.1 | 29 | |
| 30 | You may also manipulate the database from outside the EOF stack. | ||
| 31 | |||
| |
73.1 | 32 | === Squeryl === |
| |
50.1 | 33 | |
| |
73.1 | 34 | [[Squeryl>>http://max-l.github.com/Squeryl/index.html]] is a Scala internal [[Domain-specific language>>http://en.wikipedia.org/wiki/Domain-specific_language]] for database access (via SQL). |
| 35 | You may update the database from Scala Actors using Squeryl instead of using EOF. The advantage here is that you may access the database concurrently avoiding the single-threaded EOF bottleneck in your application. | ||
| |
50.1 | 36 | |
| |
73.1 | 37 | However the same caveat applies - you will need to refresh EOs in the EOF stack for the WebObjects application to reflect the changes made by Squeryl. |