Releases: Particular/NServiceBus.NHibernate
4.5.3
As part of this release we had 1 issue closed.
Bugs
#67 Cannot insert duplicate key in object 'dbo.TimeoutEntity'
Using existing message ID for timeout ID doesn't work when:
- Timeout storage is shared between endpoints
- and the same message goes through SLR subsequent times;
Fixed by always generating a new sequential GUID for timeout ID.
4.5.2
As part of this release we had 171 commits which resulted in 1 issue being closed.
Bugs
#60 4.5.1 has the wrong assembly version
Is 4.5.1 , should be 4.5.0. Fix is to update to GitVersion 1.3 and and a settings file
Where to get it
You can download this release from:
6.0.0
As part of this release we had 164 commits which resulted in 9 issues being closed.
Features
#39 Outbox implementation
NHibernate can now be used to store outbox related data
Improvements
#44 Move to .net 4.5
related to Particular/NServiceBus#2078
#13 Migrate TableNameAttribute and RowVersionAttribute to NServiceBus.SagaPersisters.NHibernate namespace
Both TableNameAttribute and RowVersionAttribute are in a very deep and hard to find namespace NServiceBus.SagaPersisters.NHibernate.AutoPersistence.Attributes
They are now migrated to NServiceBus.SagaPersisters.NHibernate
?
Bugs
#35 Provide a way for users to access the NHibernate session
Users implementing their own saga finder needs to get access to the current session. This can now be accomplished by taking a dependency on NHibernateStorageContext
. The context provides access to both the NHibernate session and the underlying raw Ado.Net IConnection
Where to get it
You can download this release from nuget
5.0.0
4.5.1
As part of this release we had 7 commits which resulted in 2 issues being closed.
Features
#33 Cache subscriptions for a short amount of time
Every time you publish a message, it will query the subscription storage for endpoints to send to. This will generate a lot of sql queries in a high throughput scenario. Considering that subscriptions rarely change (only when you install/uninstall endpoints), quering the subscription storage for every message does not make much sense, IMHO.
I've implemented a very simple cache mechanism that optionally will cache these subscriptions for a configured amount of time. Setting expiration time to just 1 second can make quite a big performance boost if you have a lot of messages.
I made some very basic performance test:
No cache:
NumberOfMessages: 5000,0 (#)
PublishTimeNoTx: 2933,5 (msg/s)
PublishTimeWithTx: 4427,8 (msg/s)
Cache set to 1 second:
NumberOfMessages: 5000,0 (#)
PublishTimeNoTx: 6083,3 (msg/s)
PublishTimeWithTx: 22741,5 (msg/s)
To enable caching:
Configure.UseNHibernateSubscriptionPersister(TimeSpan.FromSeconds(10));
Bugs
#57 TimeoutEntity.State column size in Oracle is only 2000
When NServiceBus.NHibernate create table for TimeoutEntity, State column type is set to RAW(2000)
on Oracle which is of course incorrect. I think that setting column size to int.MaxValue
should resolve problem.
Where to get it
You can download this release from nuget
5.0.0 beta1
As part of this release we had 8 issues closed.
Improvements
#44 Move to .net 4.5
related to Particular/NServiceBus#2078
#36 NHibernate role
Introduce a UsePersistence<T>
(very similar to UseTransport<T>
), eg:
Configure.With()
.DefaultBuilder()
.UseTransport<Msmq>()
.UsePersitence<NHibernate>();
See full issue*
#13 Migrate TableNameAttribute and RowVersionAttribute to NServiceBus.SagaPersisters.NHibernate namespace
Both TableNameAttribute and RowVersionAttribute are in a very deep and hard to find namespace NServiceBus.SagaPersisters.NHibernate.AutoPersistence.Attributes
These have been moved to NServiceBus.SagaPersisters.NHibernate
Bugs
#35 Provide a way for users to access the NHibernate session
Users implementing their own saga finder needs to get access to the current session:
Where to get it
You can download this release from nuget
4.5.0
As part of this release we had 21 commits which resulted in 4 issues being closed.
Bugs
#31 Only apply Inverse=true if child has a reference to parent
The bag convention can only apply inverse=true
when the child element has a reference back to the parent
#30 When updating/creating the schema we need to use the NHibernate Configuration instance from the fluent API
The installers code for NHibernate are newing up a new NHibernate.Cfg.Configuration
instead of using the one that the user could have passed us in via the fluent API.
This causes issues like:
- Setting the schema via config settings, not as default schema used with creating tables, see http://stackoverflow.com/q/22536219/90882
#26 When creating the indexes for the timeout table, they need to handle load by default
This relates to
Particular/NServiceBus#1512
The fix that was created to solve the deadlock issue, however, still did not create the default indexes the optimized way and deadlocks continue to happen under load with the current fix.
The proper fix would have been to create the indexes in the following manner:
- A non-clustered index for the Id
- A clustered index for Endpoint + Time
- A non-clustered index for SagaId
This also relates to: https://nservicebus.desk.com/agent/case/4237
Content trimmed. See full issue
#5 NHibernate persister doesn't work with Oracle 11g database
It just created simply sample application that use saga and use Oracle 11g XE as saga and timeout persistence storage. I received the following exception:
2013-08-27 12:02:55,938 [45] INFO NServiceBus.Unicast.Transport.TransportReceiver [(null)] <(null)> - Failed to process message
NServiceBus.Unicast.Transport.TransportMessageHandlingFailedException: An exception was thrown by the message handler. ---> NHibernate.TransactionException: Begin failed with SQL exception ---> System.InvalidOperationException: Connection is already part of a local or a distributed transaction
at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel)
at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel isolationLevel)
at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
--- End of inner exception stack trace ---
at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
at NHibernate.AdoNet.ConnectionManager.BeginTransaction(IsolationLevel isolationLevel)
Content trimmed. See full issue
Where to get it
You can download this release from nuget
4.4.0
As part of this release we had 21 commits which resulted in 4 issues being closed.
Improvements
#25 RowVersion attribute not supported by subclasses.
Since RowVersion
attribute is not supported in subclasses, we are now throwing a MappingException to alert the user.
#19 Implemented timestamp + dbtimestamp row version
Have added support for the last 2 scenarios mentioned in http://ayende.com/blog/3946/nhibernate-mapping-concurrency
So now, if the row version property return type is DateTime
we get a timestamp
column and if a it is byte[]
we get dbtimestamp
.
I also fixes a bug where the generated was set to "always" and for property return type of int
and datetime
it should be "never".
Bugs
#23 The bag should be marked as "inverse"
Since the child references back to its parent, the bag should be marked as "inverse".
This patch fixes #20
#20 NHibernate RowVersion saga concurrency throws errors
I get a SqlException: Cannot insert the value NULL into column 'Version'
Where to get it
You can download this release from: