Thanks Andrus, constructing my own DataRowStore did the trick :).
For anyone stumbling across this thread, here’s a method that will do this for
you.
/**
* Workaround for Cayenne not having an easy way to set the size of the
snapshot cache in code.
* It depends on the snapshotCache being lazily created, thus we can
create a new cache before it has been accessed.
*
* This will be fixed in a future version of Cayenne (4.0.M5 is current
when this is written)
*/
private static void setSizeOfSnapshotCache( DataDomain dataDomain,
Integer size ) {
Map<String,String> properties = dataDomain.getProperties();
properties.put( DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY,
size.toString() );
DataRowStore snapshotCache = new DataRowStore(
dataDomain.getName(), properties, dataDomain.getEventManager() );
dataDomain.setSharedSnapshotCache( snapshotCache );
}
Cheers,
- hugi
> On 21. feb. 2017, at 19:10, Andrus Adamchik <[email protected]> wrote:
>
> Hmm.. Custom modules used to override builder modules in the past. Looks like
> this is no longer the case since M4 (and I no longer remember what was the
> motivation for such reordering).
>
> Anyways, since DataRowStore is initialized lazily, you can create
> DataRowStore on your own after Cayenne startup and use
> DataDomain.setSharedSnapshotCache(..). Not ideal, but should work.
>
> Note to self:
>
> * We need to port property-based init flow for DataDomain into DI.
> * SyntheticNodeDataDomainProvider should be folded in the main
> DataDomainProvider (though we need to distinguish a case of "disconnected"
> stack and a stack that has a known DataSource, and simply needs an implicit
> DataNode).
>
> Andrus
>
>> On Feb 21, 2017, at 2:12 PM, Hugi Thordarson <[email protected]> wrote:
>>
>> I created a custom DataDomainProvider, but it never gets used. The reason is
>> that I’m using serverRuntimeBuilder.dataSource( DataSource ) to set the
>> DataSource. This causes ServerRuntimeBuilder to set it’s dataSourceFactory,
>> which then causes it to bind it’s own SyntheticNodeDataDomainProvider when
>> it invokes it’s builderModules() method at build time, overriding my own
>> DataDomainProvider.
>>
>> <PastedGraphic-1.png>
>>
>> How best to get around this?
>>
>> - hugi
>>
>>
>>
>>> On 17. feb. 2017, at 06:59, Andrus Adamchik <[email protected]> wrote:
>>>
>>> Only properties defined in org.apache.cayenne.configuration.Constants are
>>> recognized by DI. DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY is not one of
>>> them.
>>>
>>> We were actually going to bring the whole DataDomain configuration process
>>> into DI form the Modeler (perhaps right after M5). For now your best bet is
>>> overriding DataDomainProvider.
>>>
>>> Andrus
>>>
>>>
>>>
>>>> On Feb 16, 2017, at 11:06 PM, Hugi Thordarson <[email protected]> wrote:
>>>>
>>>> Can’t do that, the signature for put is ( String, <? extends String> ).
>>>> I've also tried a different method:
>>>>
>>>> builder.addModule( binder -> binder.bindMap( Constants.PROPERTIES_MAP
>>>> ).put( DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, 123456 ) );
>>>>
>>>> …where I used an int, doesn’t work either.
>>>>
>>>> - hugi
>>>>
>>>>
>>>>> On 16. feb. 2017, at 20:03, John Huss <[email protected]> wrote:
>>>>>
>>>>> Maybe try using an int instead of the string "123456"?
>>>>>
>>>>> On Thu, Feb 16, 2017 at 2:00 PM Hugi Thordarson <[email protected]> wrote:
>>>>>
>>>>>> Hi all,
>>>>>> I’m attempting to change the size of the snapshot cache in code (not in
>>>>>> the project xml-file). It seems this should be set through a property,
>>>>>> right? Well, I’m just not managing to set properties in code. I’ve set
>>>>>> properties in code previously using something like the below, but they
>>>>>> just
>>>>>> don’t seem to take?
>>>>>>
>>>>>> builder.addModule( binder -> ServerModule.contributeProperties( binder
>>>>>> ).put( DataRowStore.SNAPSHOT_CACHE_SIZE_PROPERTY, "123456" ) )
>>>>>>
>>>>>> Any ideas?
>>>>>>
>>>>>> - hugi
>>>>
>>>
>>
>