#1 Re: mORMot Framework » Oracle OCI ARMv8.2 VM » 2021-08-17 15:57:40

Congratulations on achieving this!

#2 Re: mORMot Framework » How to save dynamic array to TDocVariant? » 2021-05-17 20:03:26

ab wrote:

It is already used on production for some projects, and we will use it on our side - for https://www.tranquil.it/en/ - for a huge project in the next months.

One more interesting case for mORMot!

#4 Re: mORMot Framework » FPC and Lazarus versions with mORMot 1 and 2 » 2021-04-25 18:07:14

Thanks and I'm sorry, I forgot that these appears on documentation:
FPC SVN 45643 (3.2.0)
Lazarus SVN 63526 (2.0.10) << but here isn't the same

#5 mORMot Framework » FPC and Lazarus versions with mORMot 1 and 2 » 2021-04-25 15:55:12

mdbs99
Replies: 4

Hi,

Which versions of FPC and Lazarus are you currently using — installed by fpcupdeluxe — that are working well with mORMot 1 and 2 versions?
I'm building another version of my Lazarus for new projects.

Thanks.

#6 Re: mORMot Framework » mormot_base.lpk + zeos » 2021-03-09 00:48:37

So, Zeos will require mormot always?

I wouldn't say always, but if Zeos needs mORMot, this code should be provided from a package.

#7 Re: mORMot Framework » mormot_base.lpk + zeos » 2021-03-08 00:19:49

IIRC, by the time, we didn't create a package for Zeos because units were not separated as they are now in version 2.

#8 Re: mORMot Framework » mormot_base.lpk + zeos » 2021-03-08 00:18:25

ab wrote:

Thinking out loud:

What if we define a mormot2 package and a mormot2-zeos package (including only mormot.db.sql.zeos.pas) ?
Together with a zeos package and a zeos-mormot2 package.
The zeos-mormot2 package could have zeos and mormot2 as dependency, and mormot2-zeos both mormot2 and zeos as dependencies.

Or even just compile zeos with no MORMOT2 flag - and use this plain zeos package from mormot2-zeos.
I suspect the performance optimization may not be very high, since zeos is already well optimized.
If a project need the extra-performance of the MORMOT2 Zeos flag, it could use it explicitly within its build process - but for the development within the IDE, a plain zeos without MORMOT2 could be enough.

It could fix the dependency issue, I guess.

We should create a "mormot.base.pack" (or mormot.base.run, following the "suffix pattern" which "run" stands for runtime packages and "dsgn" stands for IDE installed package).
Then, create another one just for Zeos, mormot.db.zeos.pack.
Zeos team should use mormot.base.pack instead .inc, conditionals, or paths for mORMot.

#9 Re: mORMot Framework » mormot_base.lpk + zeos » 2021-03-07 12:03:43

George wrote:

"For example, zcomponent require SynCommons from mormot_base that require zcomponent."

Are you sure that Zeos is using SynCommons on its official repository? I don't update Zeos for a long time...
If yes, Zeos may use mORMot package instead to use SynCommons.pas direclty.

#10 Re: mORMot Framework » mormot_base.lpk + zeos » 2021-03-04 10:54:36

Hi,
You shouldn't add relative path to folder where Zeos.inc is located but, instead, add`zcomponent` package from ZeosLib into it (item 5 from README).

#11 Re: mORMot Framework » mORMot 2 in Good Shape » 2021-02-21 14:24:07

@okoba mORMot 1 has packages. I guess v2 should be released first, than we can add the packages following what was done in v1.

#12 Re: mORMot Framework » 1000th Commit for mORMot 2 » 2021-02-16 15:27:45

Congratulations for this excellent work!

#13 Re: mORMot Framework » mORMot 2 proposal: rename RawUTF8 type to Utf8 ? » 2020-12-30 14:02:41

ab wrote:

SynUnicode is either UnicodeString or WideString - the faster on the platform. On FPC, you have UnicodeString <> string by default, and UnicodeString=WideString on POSIX... So our SynUnicode is somewhat more consistent if you want a fast UTF-16 Type. Perhaps UTF16String may be more namingful, and closed to Utf8String convention.

For sure SynUnicode should exist - the faster on the platform, you've said - but I'm talking about the naming, which could be (T)SynUnicodeString following the convention.

About 'T' prefix, it was never the case for simple raw types like integer, string or such.

I know, from Borland yeah, but I think that following a convention is better, even more important in Pascal that is no case-sensitive. A 'T' helps for not having a collision name with a property for example.

#14 Re: mORMot Framework » mORMot 2 proposal: rename RawUTF8 type to Utf8 ? » 2020-12-30 01:47:14

RawUTF8 isn't a good name, but better than just Utf8.
Using just Utf8 seems not complete: is it a string, a stream, a char, what?

Every string type has String as suffix so, to keep a consistence a new string type should use it too. Think for example in UTF8Char type, should we rename it too? A char is "less" than a string, so a char could use Utf8 and Utf8String is a-string-of-chars(?)

SynUnicode is inconsistent because "say nothing" about the type, as it doesn't keep the naming using String as suffix—that should be renamed.

If you really want and will change the name anyway, don't think only in RawUTF8, but RawJSON, RawUnicodeString, and so on. The prefix "Raw" might be removed.

Last, you should use "T" as a prefix for all types. PRawUTF8 has "P" because it is a pointer, as TRawUTF8 uses "T" because it is a type—I don't care if Integer and Currency don't have a "T", it is inconsistent anyway.

Finally, the perfect name should be TUtf8String but I guess you won't use it...

#15 Re: mORMot Framework » Error 6 - The handle is invalid when trying to start services » 2020-12-21 13:41:29

Original code is complex (and I cannot post here). I will make an simple example without any access do DB just to know if this issue is something related to privilege to install—even though I'm using Admin, but the machine is not mine. It's part of a network with its own rules, antivirus, AD, etc.

If it works, it means that has something wrong in original code... however, it works perfectly on console mode.

#17 Re: mORMot Framework » Error 6 - The handle is invalid when trying to start services » 2020-12-18 12:40:49

Chaa wrote:

Your OpenSCManager failed with ERROR_ACCESS_DENIED.
I think you must use "Run as Administrator".

I use from the beginning...

ab wrote:

So /install works but /start fails?

If this is the case, then the service may be half-installed.
IT happens when a service installation or execution was broken, due e.g. to the executable still running when uninstalling.
Unstall it, restart the PC, ensure it is actually uninstalled, then reinstall it.

Yes, /install works but /start fails.
I did what you said and I got the same error.
On log, I have 2 Stop() calls when I tried to execute /install for the first time, after reboot.

#18 Re: mORMot Framework » Error 6 - The handle is invalid when trying to start services » 2020-12-18 01:44:49

Yes, I can install without any problem.
If I use "/start", it seems that it's started (I can see on Windows Services that status was changed) doing nothing, as it was a fake start.

Debuggint I can see below that:
1. FHandle=0
2. backupError=5 — I'm not sure why 'OpenSCManager(''%'',''%'') for [%]' wasn't register on the log file, as I'm using "*", though.

constructor TServiceController.CreateOpenService(const TargetComputer,
  DataBaseName, Name: String; DesiredAccess: DWORD);
var backupError: cardinal;
begin
  inherited Create;
  StringToUTF8(Name,FName);
  FSCHandle := OpenSCManager(pointer(TargetComputer), pointer(DatabaseName),
    GENERIC_READ);
  if FSCHandle = 0 then begin
    backupError := GetLastError;
    ServiceLog.Add.Log(sllLastError,'OpenSCManager(''%'',''%'') for [%]',
      [TargetComputer,DatabaseName,FName]);
    SetLastError(backupError);
    Exit;
  end;
  FHandle := OpenService(FSCHandle, pointer(Name), DesiredAccess);
  if FHandle=0 then begin
    backupError := GetLastError;
    ServiceLog.Add.Log(sllLastError,'OpenService("%")',[Name]);
    SetLastError(backupError);
  end;
end;

After that, returning to the TSynDaemon.CommandLine() the function Show() is going to be executed:

          cStart:
            Show(ctrl.Start([]));

Than, the last error changes for "6", after execution of StartService():

function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
  lpServiceArgVectors: Pointer): BOOL; stdcall; external advapi32
  name 'StartService'+{$ifdef UNICODE}'W'{$else}'A'{$endif};

#20 mORMot Framework » Error 6 - The handle is invalid when trying to start services » 2020-12-17 21:38:22

mdbs99
Replies: 12

I've created a console program which is a HTTP server - OK
I've created a daemon program that uses the same classes from console program - OK
I can run the daemon using /console and it works - OK

However, if I try to /start the daemon, it "starts" but I got an error on log:

20201217 21340931  !  +    ServDaemonCore.TDaemonService(026fb3e8).Stop
20201217 21340931  !  -    00.000.000
20201217 21340933  ! EXC   EOleException 80040e4d ("Especificação de autorização inválida") [] at 4fc65e  stack trace API 46ae31 404de8 77a171b4 77a03b36 4fc65e 407977 4e34b4 70b9ac 712bb1 713082 4d3c99 4d3601 760d1946 75f5fa29 779f75f4 779f75c4 

It is in Portuguese... but debugging the original error is "Error 6 - The handle is invalid when trying to start services".

Running on Windows PRO; user is Admin; it's not antivirus.

Any tips?

#21 Re: mORMot Framework » Compiling SyndbExplorer Sample » 2020-12-11 11:47:48

b-57 wrote:

i got  :

  syndbexplorerFrame.pas (line 803) Intenal Error C15309

any idea what should be done

Try delete all .dcu for this project and use Build instead Compile.
I think it is a Delphi 7 bug that happens sometimes...

#22 Re: mORMot Framework » Read Time Out » 2020-12-10 11:58:38

pvn0 wrote:

You still haven't confirmed if you are using http.sys?

Yes, I'm.

ab wrote:

From the existing logs, you should be able to find out how much time each request take, and how the thread pool is used.
If indeed the Enter/Leave of TSQLRestServer.URI takes a lot of time, and all threads are used, then you have a thread retention.
Since the problem is that there is a blocking process, and you need to wait, it is difficult to change anything.

You could try to increase the number of threads from 32 to 256 (which is the highest value allowed). It would consume a little more memory, but may help preventing timeouts.

I've already increased the number of threads from 32 to 64 and I didn't have complains so far.

This code is the same I've talked in another thread: a rewrite of code from Desktop perspective to Web. Some process take 500ms and that is great in Deskop, but not for Web. I still have a lot work to do...

#23 Re: mORMot Framework » Read Time Out » 2020-12-10 02:48:29

ab wrote:

Are you using a reverse proxy in-between?
Are you running on Windows?

On Windows, the http.sys Web server is very stable, so I doubt there is any problem on that level.

If your requests take 100ms to the DB, perhaps there is some contention on server side.

No proxy. Yes, on Windows.
Yes the server is very stable, but it seems that my app is receiving more requests that it can handle.
Unfortunately, responses are taking ~1.5s in average. That is because my app is calling another microservice (Java) to do some stuff and it takes almost 1s to do it — I'm working to remove such dependency...

---

pvn0 wrote:

Not atm, but you can add it, follow my instructions here.

Thanks. But as @ab and I has said, I'm using Windows.

---

ab wrote:

@mdbs99
Did you check https://docs.microsoft.com/en-us/window … or-httpsys as mpv proposed?

I looked quickly... I didn't know that tool. Sounds interesting... but as I understood, it just allowing me monitoring in real-time but no logging.
My problem is that they are complain about time out. But as I don't have any logs, because the request didn't touch my code, it looks like perfect from my point of view... so, I need (or I guess I need it) to have logs for those requests as a prove that they have happened.

#24 Re: mORMot Framework » Read Time Out » 2020-12-09 11:15:06

I would like to log all in the app server. Is that any chance to mORMot do that automatically, as it does for all requests?

My issue is that a consumer says that he/she got a time out, but I have nothing in my logs because the request never touch the business rules (my code, not mORMot) at all. I would like to see how many requests have not been process to make changes based on this information.

#25 mORMot Framework » Read Time Out » 2020-12-08 15:15:09

mdbs99
Replies: 10

I'm using the default configuration for my HTTP Server (i.e., 32 threads, etc...) and I got some issues from some consumers in Java: Read Time Out error.

I got nothing on log so, I imagine that all threads are working while a new request came and the server throw away after a while... (?)
My question is: how can I get aware about these requests that weren't process?

Thanks.

#26 Re: mORMot Framework » Splitting a big ERP written in Delphi 7 to microservices » 2020-12-08 15:09:24

From documentation:

16.4.2. Set up the Server factory:
"The code line above will register the TServiceCalculator class to implement the ICalculator service, with a single shared instance life time (specified via the sicShared parameter). An optional time out value can be specified, in order to automatically release a deprecated instance after some inactivity."

Is that option time out value which we're talking about all the time, to finish inactive threads?

#27 Re: mORMot Framework » mORMot2 examples » 2020-12-06 12:21:44

However it seems Delphi 7 is having a hard time with huge library files syncommons.pas and mormot.pas. Every other time i invoke code completion the IDE hangs.

I've been using mORMot on Delphi 7 with success, but I feel your pain.
Which I'm doing is:
- do not use code-completion: disable on IDE or increase in 2 or more seconds to call automatically.
- clicking on classes/functions works: you'll use it to see constructors, parameters, documentation, etc on the source.
- on SynCommons, etc, navigation doesn't work: forget Ctrl+Shift+up/down, continue Clicking on tokens.

#28 Re: mORMot Framework » Multi-tenant callbacks » 2020-11-25 19:15:20

@ab
I believe, as he is using a gateway, he don't want the gateway manage these callbacks, only "tenants" know what do do with.

#29 Re: mORMot Framework » mORMot2: anyone interested on runtime packages? » 2020-11-25 14:21:45

ab wrote:

Perhaps one potential use of packages for mORMot may be to use them instead of source for the Delphi IDE.

Besides, mORMot already has packages for Lazarus...

#30 Re: mORMot Framework » Serious conversion problem with Linux/mORMot/mongoDB » 2020-11-22 11:56:03

macfly wrote:

Yes, I am making a cross compiler, Win64 -> Linux 64.
I didn't know about these problems.

I will try to make this Win32 -> Linux cross compilation and report the result here.

Thanks for the informations.

You can read more about the context and the confirmation from FPC Team.

#31 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 21:38:42

pvn0 wrote:

I know that you don't control clients, I meant that you wrote the service implementation on the server side. Sorry if I didn't make that clear.

Sorry if I didn't understand you too.

#32 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 20:12:44

macfly wrote:

I agree with pvn0.

I cannot shutdown the service, even after this period, if the client already was using the service before

If there is information that will only be on instance A and that cannot be continued on instance B, is this not a type of session?

Instead of trying to discovery if mORMot does what I want to implement, you (all) are trying to know "why" I need it...  sad

Guys, maybe the archtecture there is wrong; maybe storing the URL's of services in a database is wrong... but this is already exists and I need to work with.

#33 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 20:07:55

mpv wrote:

The thing you call "A/B service" is known as "Blue-Green Deployment" (google for it) and it usually implementing using some kind of load balance.
Announcing a new URL to client is tooooo complex.
Better to set up a load balance in front of your services, so you can start new instance, instruct load balance to proxy new requests to the new instance and when shut down old instance.
I use nginx for such task, but HAPxoxy is also good candidate. Even IIS may be can do such.

I can't choose what I want to use. They are paying me to do a job. That's it. Maybe I can use IIS, but I don't know yet.
I wrote "A/B service" (quoted), as it is just an idea and not the Blue-Green Deployment. Thanks, anyway.

pvn0 wrote:

You are writting very contradicting things, you say there is no session but your entire problem seems to be session related, or lack of.

That is because I'm thinking far. I have a job to do now, but new ones in a near future. I'm apologize if it's confusing for you.

Right, you wrote the service implementation, so if a client is using instance-A when you swap to instance-B, YOU should know that already because you wrote the service implementation big_smile

I've already said to you that I don't control clients. It's not about a Delphi client-server. Is much more than that... Java, services, website... anyway.

#34 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 18:17:02

macfly wrote:

Okay, now I think I understand.
You return the URL at the beginning of the session and it will be the same until the client is finished.

In theory a client can stay for hours in the same session and you would not be able to make this replacement within a constant period.
You can end up with hours of delay if the client remains open.

Almost that smile
Clients should get from a database the URL for each (active) services.
So, you don't need a session (this service doesn't have one). But clients SHOULD refresh its own "list of URL services" in a *period of time*. If some client haven't updated its list and still trying to use the instance-A—AFTER this period of refreshing—I don't care if he/she got a 400 error because he/she should used the active service, which is instance-B.

But I cannot shutdown the service, even after this period, if the client already was using the service before — that could exists in other type of services, which I will implement as well, and that is why I would like to know how to shutdow the service without kill someone unintentialy. I would like to do this properly, clean, without workarounds.

#35 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 17:52:52

pvn0 wrote:

@ab is right as always big_smile

As I guy that worked directly with him, I always had this thought... but not this time smile

Just incase you need this or anyone is wondering :

THttpServer(aHTTPServer.HttpServer).ThreadPool.RunningThreads
THttpServer(aHTTPServer.HttpServer).ThreadPool.PendingContextCount

RunningThreads will tell you how many threads in the pool are active and PendingContextCount will tell you how many requests are queued for processing. (don't call PendingContextCount too often because it uses a lock).

THANK you, to give some light on this thread! Now I start to think that is possible to do what I NEED to do.
I don't know about PendingContextCount (I will read documentation) but as I'm answering you: so, I can return this value and if it is zero I can know, for sure, that no resquest still in a list to be process, right?

Either way if you shutdown your server and your client gets an error you should either A.) be sure all clients have been notified of server change prior to shutdown B.) handle the error on client side.

I cannot control the clients, which is other apps (website, other Java services, of course the Delphi client, and anyone that wants to use that service).

#36 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 17:44:41

macfly wrote:

But if server A is no longer receiving requests after a while, why would someone still be using it?

"I cannot stop the service even if just one person is using it, because I cannot control if this client got the new URL, from the database, to use the instance-B."

#37 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 17:40:13

ab wrote:

Whatever there are threads still working or not, is not relevant. I am afraid you still don't understand how the mORMot HTTP server thread pool works, and that "killing the threads" doesn't mean anything in our context. The threads are not running, they are sleeping until there is a request incoming.

Arnaud, I know that threads are not running if nobody is send request. Yes, they are sleeping, but I (as an admin of the service, not as a developer that has created) don't know if thread are sleeping or running, before I kill the process.

I cannot drop a user that is using the service. I just can't... and I'm afraid that you still don't understand me. Again, I cannot stop the service even if just one person is using it, because I cannot control if this client got the new URL, from the database, to use the instance-B!

There is already a feature in TSQLRestServer/THttpServer which allows a graceful shutdown of the server process.
If you just stop the mORMot daemon, it will shutdown properly, refusing any new input and finishing the pending requests.
So you can safely shutdown one instance, which won't accept any more request, and another one could take the next requests. If you want 100% up time, you can put a front-end, e.g. nginx reverse proxy with load balancing to the two instances.

Are you talking about mORMot 2.0?
If it already exists in 1.18 let us know, as everybody still using that version.

Another information is that I'm not using a demon (yet).

...refusing any new input and finishing the pending requests.

By "finishing" you meant stop to process in the middle, returning an error to the client? If I understood wrong, please try to explain again, otherwise I cannot do that.

PS: I cannot tell them what I would like to use (nginx, IIS, whatever). By now, I would like to use just mORMot service process.

#38 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 16:29:04

macfly wrote:

...a time of 5 minutes after you have redirected requests to server B will be enough so that server A is not doing anything else.

For sure, I don't know. I can just suppose that no one is using...
I cannot guarantee that a service is always online,  100% of time, if I can shutdown someone that are using it because I supposed that no one was using.
Don't you agree?

PS: Thanks for understand me!

#39 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 15:57:42

pvn0 wrote:

From what I understand, your own code blocks the threads from exiting gracefully. You should never do that and you should never kill a thread.

My own code do nothing. Threads are there, running forever and I'm not killing them.
I just would like that mORMot kill them, *if* they are doing nothing for a period of time...

macfly wrote:

Actually, what you want to do is finish the application, right?

Ending threads being executed by the application will not allow the executable to be replaced.

No, I can finish the app anytime, but "brutally"! If I call "shutdown" any moment, some thread may not finished its job and the client will receive an error.

But, if there is no thread running, I can call "shutdown" to kill the HTTP server quietly and replace the binary (with a cup of coffee in my hand...), as the new version of the service is already running in a new URL (instance-B), which means that my service is never down.


Guys,

All services are registered in a database. All clients should first get the URL from there to know where is the active instance.
If I want to replace any binary I will first change that register, pointing to a new instance (B), which means that all new requests will use the new version (B).
Then I just wait "the period of time" knowing that mORMot will kill all threads that are in stand by... only the server will stay active, then I call shutdown.

That is what I do to maintain the service online 24h/d. If you, guys, know another way to do that — I mean, always having an instance available for the clients — please, teach me.

#41 Re: mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 14:15:51

I wrote with a context in my mind and I might haven't express myself in a good way.
I know that "The threads are part of the thread pool, so they are by definition allocated at startup, until the process exits." and there is nothing wrong with. What I'm asking is if there is a (default) way to a server kill those threads automatically, if they are inactive.

"Finishing" such threads is not the solution to the problem of DB connections, for instance.

It can help. If there are no new requests, threads will die and for the next new request they will be created again, using a new connection.

"allow me to replace binaries without forcing a shutdown" need a better explanation (my mistake, sorry):
I want to implement a "A/B service" which means that, if I need to replace the instance-A, I will first publish an instance-B, change the URI and port (that remains in a database) for all new requests point to the new service instance. Then, when all requests finished in instance-A, I'm able to remove the binary, replacing with the same version in B — for the next version I can do the opposite, starting with instance-B.

If threads are not killed automatically, I need to check the server using another approach only to know if something stay in process.
Just as an example, using IIS + FastCGI + fpWeb, I can setup IIS to kill my threads using the approach that I've explained above. But I'm not using IIS or Apache... just mORMot.

Have you understood now?

#42 mORMot Framework » How configure the server to finish inactive threads? » 2020-11-16 11:58:30

mdbs99
Replies: 22

How can I configure the server to finish inactive threads in a period of time?
Doing that will prevent some errors — see https://synopse.info/forum/viewtopic.ph … 398#p33398 — and allow me to replace binaries without forcing a shutdown, for example.

--
Original post https://synopse.info/forum/viewtopic.ph … 402#p33402

#43 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 18:52:59

Just to mention: TADOConnection has a KeepConnection property, which means that. And it works.
But I need my services more stronger than that. For example, if the network has down/broke, KeepConnection is not enough and an exception will occur.

So, when I got this exception was because it was running in a develop database, which is renew every day, dropping all connections of course.

#44 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 18:34:09

macfly wrote:

I mentioned above that I save the time that connection was last requested and renew before reaching the timeout.
So this problem does not occur in my case.

I'm not sure if I can use like you did. In my mind, to do that I will always need to check the connection before, for each method on server.
I can save the time that the thread got the connection, then code a function that will check that time and renew the connection before give it to the program... but doing that every time is error prone, IMHO.

Would be nice 1) mORMot kill threads in a period of time or 2) I kill my threads in a period of time.
But I'm waiting @ab say something, as I need that working but I would like to do in a best way considering how the framework works.

The question is whether this would apply to mORMot.
I don't know if in mORMot there is a way to intercept when the connection is requested.

Other problem is that I'm not using mORMot DB (SynOleDB). If I did, I wouldn't have any problem, as Arnaud already check this internally, renewing connections time to time.

#45 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 17:46:09

macfly wrote:

...
But is this a problem? What error could occur if a connection that is not being used is idle on a thread that is also not in use?

The DBMS will kill connection in a period of time on idle, but the thread won't know about it; then the client will get an exception.

#46 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 17:10:03

macfly wrote:

...When a new request occurs, its expiration will be checked and if it is expired it is renewed.

That it was I meant when said "...if no client sent a request, you can't be able to remove any other inactivity connection", i.e., first you need a request then you could do other things like renew connections.

In the case of mORMot is need to analyze how and when the connection is requested, - but I believe that it will not be possible to do the same.

In this case the timer would be better.

Yes, this is the question.
You will have to dig deep into the code and tests to see how and when threads and connections are created and released by mORMot.

But I'm writing here to get some help from who knows the internal framework sad

@ab?

#47 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 15:14:13

@macfly
If I understood correct the concept of your pool, you could still get an exception by inactivity. I mean, if no client sent a request, you can't be able to remove any other inactivity connection... but only by a timer (do you use?).

Anyway, I still thinking that would be nice and easier if the server finished threads by end of a (configurable) period.

At least in my case, I don't care if next request will be the first that will create all threads again, as all were gone eventually. Does mORMot can do that?

#48 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 12:53:41

Maybe the easiest way is inform the server to release threads in a period of time, then I can setup this period as being less than the current timeout of DBMS.

I will search about it, but if you @ab or anybody can tell me first, I will appreciate.

#49 Re: mORMot Framework » The Trim in SysUtils conflicts with the Trim defined in SynCommons » 2020-11-13 12:40:16

There is Spring4D but I've never used and I don't think it is relevant, due we already have mORMot.

#50 Re: mORMot Framework » Remote JSON REST Service - calling COM in Service fails » 2020-11-13 11:56:58

ab wrote:

What you created is some kind of a connection pool: one connection per thread.
You don't recreate the connection for each request. smile

As my service was defined as sicSingle, it wouldn't be one connection per request?

EDIT: ah, Ok. I think only the implementation of the interface will be create per request, not threads.

Of course, I understand that the connections are not reused from one thread to another.
But if you use a thread pool, like the mORMot HTTP server, then it is not an issue to not reuse the connections.

Also note that in the long-term, some DB connections tends to break, or may have resource leaks.
A typical problem is when the connection is not used for a while, there may be a timeout on the server side, and the connection is closed. Then you get an exception on the client side, the next time you use it.

That was exactly what I would test today... and got an exception:

{
"errorCode":500,
"error":
{"EOleException":{"EOleException":"Connection failure"}}
}

With a few number of clients, we have seen it often. For instance, during the night there is almost no service usage, so first time in the morning, the DB connections raise errors.
What we do in SynDB is to release and reinitialize a connection after some time or number of requests, even if the thread is still the same.

You know that I can't use SynDB due the legacy code... Do you have any tip so I can implement something similar?
Which method should I override to put a timer? Maybe an external service doing fake pings?

Board footer

Powered by FluxBB